92 dokcer

Docker

簡介與概述
1.Docker 是一個(gè)開源的應(yīng)用容器引擎,基于 Go 語言 并遵從 Apache2.0 協(xié)議開源。
Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個(gè)輕量級、可移植的容器中,然后發(fā)布到任何流行的 Linux 機(jī)器上,也可以實(shí)現(xiàn)虛擬化。

  1. Docker的主要目標(biāo)是‘build ,ship and run any app,anywhere’,也就是說通過對應(yīng)用程序組件的封裝,分發(fā),部署,運(yùn)行等生命周期的管理。使用戶的app(可以是一個(gè)web應(yīng)用程序或者數(shù)據(jù)庫應(yīng)用等)及其運(yùn)行環(huán)境能夠做到‘一次封裝,到處運(yùn)行’。
    3.Linux容器技術(shù)的出現(xiàn)解決了這個(gè)問題。而docker就是基于他的基礎(chǔ)上發(fā)展過來的。將應(yīng)用運(yùn)行到docker容器上面,而docker容器在任何操作系統(tǒng)上都是一致的,這就是實(shí)現(xiàn)跨平臺(tái)跨服務(wù)器。只需要一次配置好環(huán)境,換到別的機(jī)子上就可以一鍵部署好,大大簡化了操作。
  2. 容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
    5.Docker 從 17.03 版本之后分為 CE(Community Edition: 社區(qū)版) 和 EE(Enterprise Edition: 企業(yè)版),我們用社區(qū)版就可以了。

Docker實(shí)際上就是一個(gè)虛擬化輕量級linux服務(wù)器,可以解決我們在開發(fā)環(huán)境中運(yùn)行配置問題。

為什么需要使用docker

Docker:虛擬化容器技術(shù)
Docker主要解決我們開發(fā)環(huán)境配置遷移的問題。

1.我們現(xiàn)在開發(fā)了一個(gè)javaweb項(xiàng)目,需要依賴很多環(huán)境配置 比如:Tomcat、JDK環(huán)境、Nginx、Redis環(huán)境等。
2.本地需要安裝這些環(huán)境Tomcat、JDK環(huán)境、Nginx、Redis環(huán)境等,在打war包給運(yùn)維部署在linux服務(wù)器,運(yùn)維人員也需要在linux服務(wù)器上安裝Tomcat、JDK環(huán)境、Nginx、Redis環(huán)境。
3.但是有時(shí)候可能會(huì)發(fā)生這些問題:我在本地運(yùn)行環(huán)境沒有問題,但是打包到Linux服務(wù)器運(yùn)行總是遇到很多錯(cuò)誤,大多數(shù)由于一些版本沖突影響。
4.所以在這時(shí)候我們就可以使用docker部署和安裝軟件就非常方便,直接將該springboot項(xiàng)目制作成一個(gè)鏡像文件,鏡像文件中包含jdk版本 tomcat版本信息 直接部署linux即可,減少依賴沖突概率。

看看linux安裝mysql
https://blog.csdn.net/qq_42097051/article/details/113726893 在不同的linux內(nèi)核中安裝

Mysql很容易發(fā)生版本沖突的問題。
在對比docker安裝mysql
docker pull mysql:5.7
docker create --name mysql3308 -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 mysql:5.7

Docker最終解決了運(yùn)行環(huán)境配置中的問題。----鏡像文件底層封裝好了

Springboot 核心思想----

使用docker的好處

  1. 簡化配置 安裝創(chuàng)建非常的方便
  2. 代碼流水線(Code Pipeline)管理 傳統(tǒng)項(xiàng)目部署可能需要經(jīng)過很多環(huán)節(jié),
    容易產(chǎn)生版本的依賴沖突問題,Docker給應(yīng)用提供了一個(gè)從開發(fā)到上線均一致的環(huán)境,讓代碼的流水線變得簡單不少
  3. Devops 開發(fā)與運(yùn)維一體化減少溝通的成本 (docker或者是k8s實(shí)現(xiàn))
  4. 虛擬技術(shù) 快速部署
  5. 彈性擴(kuò)容
    應(yīng)用場景
    1.Web 應(yīng)用的自動(dòng)化打包和發(fā)布。
    2.自動(dòng)化測試和持續(xù)集成、發(fā)布。
    3.在服務(wù)型環(huán)境中部署和調(diào)整數(shù)據(jù)庫或其他的后臺(tái)應(yīng)用。
    4.從頭編譯或者擴(kuò)展現(xiàn)有的 OpenShift 或 Cloud Foundry 平臺(tái)來搭建自己的 PaaS 環(huán)境。
    容器與虛擬機(jī)區(qū)別
    什么是虛擬機(jī):在一臺(tái)物理機(jī)器上,利用虛擬化技術(shù),虛擬出來多個(gè)操作系統(tǒng),每個(gè)操作系統(tǒng)之間是隔離的。

從下到上理解上圖:

最下面的一層就是物理機(jī),可以是服務(wù)器,設(shè)置是一臺(tái)個(gè)人電腦;

電腦上需要安裝操作系統(tǒng),比如我們安裝了win10的操作系統(tǒng);
再往上就是虛擬機(jī)軟件了,比如我們常用的VirtualBox、VMWare,它們的作用是模擬計(jì)算機(jī)硬件;

繼續(xù)向上,就是虛擬機(jī)模擬出來的操作系統(tǒng)了;

在虛擬的操作系統(tǒng)中,安裝所需的軟件、組件等。比如我們需要在虛擬操作系統(tǒng)中安裝JDK、Tomcat等;

最后就是具體的應(yīng)用了,例如部署到Tomcat中。

Docker :Docker是開源的應(yīng)用容器引擎

依然從下往上看:
最下面兩層,概念同上。
往上,可以看做Docker容器的管理器。
依賴和應(yīng)用都被打包成了Docker鏡像。例如,JDK、Tomcat、應(yīng)用都被打包在了一起,運(yùn)行在Docker容器里,容器和容器間是隔離的。

Docker和虛擬機(jī)的區(qū)別

1.從兩者的架構(gòu)圖上看,虛擬機(jī)是在硬件級別進(jìn)行虛擬化,模擬硬件搭建操作系統(tǒng);而Docker是在操作系統(tǒng)的層面虛擬化,復(fù)用操作系統(tǒng),運(yùn)行Docker容器。
2.Docker的速度很快,秒級,而虛擬機(jī)的速度通常要按分鐘計(jì)算。
3.Docker所用的資源更少,性能更高。同樣一個(gè)物理機(jī)器,Docker運(yùn)行的鏡像數(shù)量遠(yuǎn)多于虛擬機(jī)的數(shù)量。
4.虛擬機(jī)實(shí)現(xiàn)了操作系統(tǒng)之間的隔離,Docker是進(jìn)程之間的隔離,虛擬機(jī)隔離級別更高、安全性方面也更強(qiáng)。
5.虛擬機(jī)和Docker各有優(yōu)勢,不存在誰替代掉誰的問題,很多企業(yè)都采用物理機(jī)上做虛擬機(jī),虛擬機(jī)中跑Docker的方式。

特性 容器 虛擬機(jī)
啟動(dòng)速度 秒級 分鐘級別
硬盤使用 一般為MB 一般GB
性能 接近原生 弱于
系統(tǒng)支持量 單機(jī)支持上千個(gè)容器 一般幾十個(gè)
隔離性 完全隔離 完全隔離

Docker官網(wǎng)
https://docs.docker.com/
https://www.docker.com/
Docker安裝

Docker 要求 CentOS7 系統(tǒng)的內(nèi)核版本在 3.10以上 ,查看本頁面的前提條件來驗(yàn)證你的CentOS 版本是否支持 Docker 。
建議安裝 CentOS-7.6-x86_64-DVD-1810.iso Docker-CE-19.03.05
鏈接:https://pan.baidu.com/s/16noDp8m8B4w8w7f4hzEAzg
提取碼:08yo
不要使用CentOS-7.6-1406-x86_64-DVD.iso,默認(rèn)下載最新的docker的話 一直啟動(dòng)失敗!
CentOS-7.6-x86_64-DVD-1810.iso 相關(guān)虛擬機(jī):
1、安裝所需的軟件包
yum-utils提供了yum-config-manager 效用,并device-mapper-persistent-data和lvm2由需要 devicemapper 存儲(chǔ)驅(qū)動(dòng)程序。
sudo yum install -y yum-utils
device-mapper-persistent-data
lvm2
2.設(shè)置穩(wěn)定的安裝源(存儲(chǔ)庫)
sudo yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo

  1. 安裝docker-ce-19.03.5
    我這里選擇安裝docker-ce-19.03.5版本,如果你在安裝的時(shí)候查詢到新的版本,只要按照格式安裝就可以了,注意版本號。
    軟件包名稱是軟件包名稱(docker-ce)加上版本字符串(第二列),從第一個(gè)冒號(:)一直到第一個(gè)連字符,并用連字符(-)分隔。例如,docker-ce-19.03.5。
    yum install docker-ce-19.03.5 docker-ce-cli-19.03.5 containerd.io
    4.安裝完成后,運(yùn)行下面的命令,驗(yàn)證是否安裝成功。
    docker -v 或者docker info

5.啟動(dòng)并加入開機(jī)啟動(dòng)
systemctl start docker
systemctl enable docker
如果啟動(dòng)docker 報(bào)錯(cuò):sudo systemctl start docker Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl -xe” for details.
大多數(shù)是因?yàn)镃entOS的版本安裝存在些問題。
英文只能通過谷歌的搜索引擎---

Docker快速入門
Docker核心名詞

鏡像文件
容器
倉庫

鏡像:簡單理解為就是一個(gè)安裝包,里面包含容器所需要運(yùn)行的的基礎(chǔ)文件和配置信息
,比如:redis鏡像、mysql鏡像等。
鏡像的來源方式:

  1. 自己做鏡像 比如(自己開發(fā)微服務(wù)項(xiàng)目)
  2. 拉取別人制作好的鏡像, 例如 nginx、mysql、redis等。

容器: 容器就是鏡像運(yùn)行的實(shí)例,容器狀態(tài)分為:初創(chuàng)建、運(yùn)行、停止、暫停、
刪除, 一個(gè)鏡像可以創(chuàng)建多個(gè)不同的容器。

每個(gè)鏡像文件都有自己獨(dú)立ip信息---輕量級的linux服務(wù)器 虛擬化

比如:鏡像就是類 容器就是實(shí)例對象

倉庫: 倉庫可以簡單理解為,專門存儲(chǔ)鏡像文件倉庫, 類似于 谷歌手機(jī)市場,統(tǒng)一在
谷歌手機(jī)市場下載開發(fā)者的安裝包。
Docker 公開倉庫地址: Docker hub
https://hub.docker.com/

Docker官方倉庫:https://hub.docker.com/ ----訪問比較慢

宿主機(jī):當(dāng)前win7操作系統(tǒng)

  1. 需要制作鏡像文件(springboot項(xiàng)目)------類似于開發(fā)者開發(fā)安裝應(yīng)用程序打包
  2. 需要將我們制作好的鏡像文件提交到docker倉庫中-----開發(fā)者將自己的app應(yīng)用程序發(fā)布安卓手機(jī)助手中。
  3. 本地需要拉去我們docker倉庫中下載鏡像文件,在交給我們?nèi)萜鬟\(yùn)行---用戶從app市場中下載安裝包運(yùn)行。

1.在需要制作鏡像文件,將該鏡像文件發(fā)布到docker倉庫
docker倉庫 dockerhub ----谷歌安卓手機(jī)市場 國內(nèi)加速鏡像
阿里云、網(wǎng)易、科大()----360、小米、華為。

  1. 從docker倉庫下載鏡像文件-----用戶從手機(jī)市場中,下載軟件。
  2. docker運(yùn)行鏡像文件----容器---獨(dú)立ip訪問信息-----端口號碼映射

Docker下載鏡像原理
Docker pull 從遠(yuǎn)程docker 官方倉庫下載 鏡像,到本地,在使用容器運(yùn)行該鏡像。
注意的是:docker官方鏡像倉庫地址部署在國外,下載鏡像可能比較慢,建議配置國內(nèi)加速鏡像

Docker加載鏡像配置
https://hub.docker.com/search?q=redis&type=image ---在國外訪問可能比較慢
國內(nèi)從 DockerHub 拉取鏡像有時(shí)會(huì)遇到困難,此時(shí)可以配置鏡像加速器。Docker 官方和國內(nèi)很多云服務(wù)商都提供了國內(nèi)加速器服務(wù),例如:

科大鏡像:https://docker.mirrors.ustc.edu.cn/
網(wǎng)易:https://hub-mirror.c.163.com/
阿里云:https://<你的ID>.mirror.aliyuncs.com
七牛云加速器:https://reg-mirror.qiniu.com
當(dāng)配置某一個(gè)加速器地址之后,若發(fā)現(xiàn)拉取不到鏡像,請切換到另一個(gè)加速器地址。國內(nèi)各大云服務(wù)商均提供了 Docker 鏡像加速服務(wù),建議根據(jù)運(yùn)行 Docker 的云平臺(tái)選擇對應(yīng)的鏡像加速服務(wù)。
阿里云加速鏡像配置
我的加速鏡像:https://66mzqrih.mirror.aliyuncs.com

阿里云鏡像獲取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陸后,左側(cè)菜單選中鏡像加速器就可以看到你的專屬地址了:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://66mzqrih.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

如何查看加速鏡像安裝成功
輸入:docker info

Docker常用命令
docker --help 幫助命令
docker --version
docker -version
docker images
查看本地images 鏡像緩存

docker images 查看本地鏡像文件
docker rmi -f kibana:5.6.9 ---刪除鏡像文件

REPOSITORY 存儲(chǔ)庫名稱
Tag 鏡像的標(biāo)簽 不寫版本號碼 默認(rèn)下載最新latest鏡像
IMAGE ID 鏡像id
CREATED 創(chuàng)建時(shí)間
SIZE 大小

docker images -a
docker images -q ---只顯示鏡像的id
docker images --digests ---顯示鏡像的摘要信息
docker images --no-trunc ---顯示完整鏡像信息

docker rmi tomcat(鏡像文件名稱)
docker search
docker search mysql
https://hub.docker.com/

docker search -s 30 mysql 列出點(diǎn)贊數(shù)超過30以上。

latest 表示為最新的鏡像文件 mysql8.0版本
docker pull

latest -----tag 最新版本的鏡像文件

docker pull nginx:latest --默認(rèn)的情況下 下載最新版本的鏡像 可以通過
https://hub.docker.com/_/nginx?tab=tags&page=1&ordering=last_updated

容器管理
查看容器信息
Docker ps 獲取到容器id
docker inspect 1e07cc5cc78d
運(yùn)行容器
docker run
docker run -i(保持容器一直運(yùn)行)-t(給容器一個(gè)偽終端)-d(后臺(tái)運(yùn)行,不直接進(jìn)入容器) --name=tomcat9.2(給啟動(dòng)容器起名字)-p 8080:8080(宿主:docker容器)tomcat:9.2(啟動(dòng)的容器) 【參數(shù)】(加入容器初始化命令)

通過 -it 啟動(dòng)的容器有兩個(gè)特點(diǎn) 一創(chuàng)建就進(jìn)入容器 exit退出容器 容器就會(huì)停止運(yùn)行 ---交互式容器

通過 -id 創(chuàng)建的容器 docker exec -it tomcat9.2(--name起的名稱)進(jìn)入容器 exit退出容器 容器不會(huì)停止運(yùn)行 ---守護(hù)式容器

docker ps 查看正在運(yùn)行的容器
docker ps -a 查看運(yùn)行和已經(jīng)運(yùn)行關(guān)閉大的容器
docker stop tomcat8 關(guān)閉容器
docker start tomcat8 啟動(dòng)容器
docker rm tomcat8 刪除容器
docker inspect tomcat8 查看容器信息
docker exec 參數(shù) 進(jìn)入容器
docker run 運(yùn)行原理

docker run mayikt

簡單描述:首先會(huì)先從本地獲取獲取mayikt鏡像文件,如果本地沒有該鏡像文件則會(huì)去
阿里云倉庫查找該鏡像文件,如果阿里云倉庫也沒有該鏡像文件,則會(huì)報(bào)錯(cuò)找不到
鏡像文件。
獲取到鏡像文件之后直接運(yùn)行。
詳細(xì)描述:
1.docker在本機(jī)緩存中 mayikt鏡像文件,如果本地存在該鏡像文件
,則以該鏡像文件作為模板在容器中運(yùn)行。
2.如果本地緩存中,沒有mayikt鏡像文件 則會(huì)從dockerhub 或者加速鏡像中
查找,如果查找不到的話,則返回錯(cuò)誤找不到該鏡像。

  1. 如果能夠查找到該鏡像,則以該鏡像作為模板運(yùn)行。

每個(gè)容器都有自己獨(dú)立的網(wǎng)絡(luò) ip信息 運(yùn)行成功 就是一個(gè)輕量級linux操作系統(tǒng)

啟動(dòng)容器
docker start 容器id
停止容器
docker stop 容器id
刪除容器
docker rm 容器id
進(jìn)入容器中

首先使用下面的命令,查看容器ID(CONTAINER ID):

docker ps -a

然后用下面的命令進(jìn)入容器,就可以使用bash命令瀏覽容器里的文件:

docker exec -it [CONTAINER ID] bash

有的鏡像沒有bash命令,可以用對應(yīng)的shell,比如sh

docker exec -it [CONTAINER ID] sh

Docker 鏡像原理
鏡像是什么

基于docker安裝tomcat服務(wù)器 是否需要配置jdk環(huán)境變量呢?
docker安裝tomcat:8 --jdk8 配置環(huán)境變量
docker安裝tomcat:9 --jdk9 配置環(huán)境變量
如何封裝配置環(huán)境依賴的呢?

Dockerfile---文件

Tomcat 100mb
1.依賴于我們JDK 200mb
2.Linux服務(wù)器centos 200mb

鏡像是一種輕量級、可執(zhí)行的獨(dú)立軟件包,用來打包軟件運(yùn)行環(huán)境和基于運(yùn)行環(huán)境的開發(fā)軟件,它包含運(yùn)行某個(gè)軟件所需的所有內(nèi)容,包括代碼、運(yùn)行時(shí)、庫、環(huán)境變量和配置文件。

鏡像文件的組成通過 Union fs
運(yùn)行我們tomcat鏡像文件

tomcat鏡像文件

  1. 依賴于我們JDK
  2. Linux服務(wù)器

為什么運(yùn)行tomcat鏡像文件,不需要配置jdk環(huán)境變量。

  1. tomcat鏡像文件包含jdk依賴鏡像 tomcat8-----jdk8鏡像文件
  2. 底層dockerfile -----描述配置jdk環(huán)境

鏡像加載的原理
Linux文件系統(tǒng)由bootfs和rootfs兩部分組成
bootfs:包含bootloader(引導(dǎo)加載程序)和 kernel(內(nèi)核)
rootfs: root文件系統(tǒng),包含的就是典型 Linux 系統(tǒng)中的/dev,/proc,/bin,/etc等標(biāo)準(zhǔn)目錄和文件
不同的linux發(fā)行版,bootfs基本一樣,而rootfs不同,如ubuntu,centos等

Docker鏡像底層實(shí)際上是有多個(gè)不同的聯(lián)合文件系統(tǒng)組成的

最底層:bootfs,并使用宿主機(jī)的bootfs-復(fù)用
第二層:root文件系統(tǒng)rootfs,稱為base image
Union fs
然后再往上可以疊加其他的鏡像文件
統(tǒng)一文件系統(tǒng)(Union File System)技術(shù)能夠?qū)⒉煌膶诱铣梢粋€(gè)文件系統(tǒng),為這些層提供了一個(gè)統(tǒng)一的視角,隱藏多層的存在,我們看來只是存在一個(gè)文件系統(tǒng)。

所以當(dāng)我們安裝的tomcat鏡像大小是600多MB 是因?yàn)槔锩孢€包含了jdk和centos的鏡像
而centos鏡像復(fù)用了宿主機(jī)的bootfs 下載的只有rootfs 所以小很多

所以tomcat>jdk(父鏡像)->centos> 所以整個(gè)向外暴露就是600MB
鏡像只讀 當(dāng)從一個(gè)鏡像啟動(dòng)容器時(shí), 所以docker會(huì)在鏡像上面加載一個(gè)可讀可寫的文件系統(tǒng)作為容器運(yùn)行。

https://hub.docker.com/_/tomcat

Docker Commit
主要作用:根據(jù)當(dāng)前容器制作為鏡像文件

流程:

  1. 從docker hub中下載一個(gè)tomcat8鏡像文件;
  2. 運(yùn)行tomcat8鏡像文件 在tomcatwebapps 目錄中新增 mayikt文件夾 index.html
  3. 將當(dāng)前容器內(nèi)容根據(jù)模板制作為鏡像文件

docker commit提交容器副本使之成為一個(gè)新的鏡像
命令:docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要?jiǎng)?chuàng)建的目標(biāo)鏡像名:[標(biāo)簽名]

  1. 安裝一個(gè)tomcat8
    docker run -p 8081:8080 tomcat:8
  2. docker exec -it 3a06b4c779a8 bash
  3. cd webapps
  4. mkdir mayikt
  5. touch index.html
  6. echo "mayikt" >>index.html

docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要?jiǎng)?chuàng)建的目標(biāo)鏡像名:[標(biāo)簽名]

1.根據(jù)當(dāng)前容器作為模板制作為鏡像文件
docker commit -m="mayikt tomcat" -a="mayikt" 3a06b4c779a8 mayikt-tomcat:1.0
2.在以當(dāng)前自己制作的鏡像文件運(yùn)行
docker run -p 8088:8080 mayikt-tomcat:1.0

Docker數(shù)據(jù)卷

基本的概念
數(shù)據(jù)卷就是宿主機(jī)上的一個(gè)文件或目錄
當(dāng)容器目錄和數(shù)據(jù)卷(宿主機(jī))目錄綁定,雙方修改會(huì)立即同步操作
一個(gè)數(shù)據(jù)卷可以被多個(gè)容器同時(shí)掛載
數(shù)據(jù)卷作用:容器數(shù)據(jù)的持久化 外部機(jī)器和容器間接通信 容器之間數(shù)據(jù)交換
使用 -v命令。
數(shù)據(jù)卷添加的方式
容器內(nèi)與宿主機(jī)實(shí)現(xiàn)數(shù)據(jù)的共享
數(shù)據(jù)卷--添加兩種方式

  1. 直接命令形式添加 docker run -it -v 宿主機(jī)絕對路徑目錄:容器內(nèi)目錄 鏡像文件名稱
  2. Dockerfile方式添加

安裝Nginx實(shí)現(xiàn)負(fù)載均衡
掛載nginx html文件
https://hub.docker.com/search?q=nginx&type=image

  1. 創(chuàng)建掛載目錄
    mkdir -p /data/nginx/{conf,conf.d,html,logs}

  2. 啟動(dòng)docker容器
    docker run --name nginx81 -d -p 81:80 -v /data/nginx/html:/usr/share/nginx/html nginx

-v /data/nginx/html 虛擬機(jī)目錄 --掛載 容器目錄 /usr/share/nginx/html
上傳一個(gè) html 放入到 /data/nginx/html

docker run --name nginx81 -d -p 81:80 -v /data/nginx/html:/usr/share/nginx/html nginx

-v /data/nginx/html: linux虛擬機(jī)目錄
/usr/share/nginx/html 容器中html目錄

nginx .conf文件和日志文件
docker run --name nginx81 -d -p 81:80 -v /data/nginx/html:/usr/share/nginx/html
-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /data/nginx/logs:/var/log/nginx nginx

\反斜杠 表示換行
/usr/share/nginx/html
/usr/share/nginx/conf
/usr/share/nginx/log

Docker實(shí)戰(zhàn)部署軟件
安裝Tomcat服務(wù)器
docker run -p 8081:8080 tomcat:8

-p 8081 :8080 容器外部(linux虛擬機(jī)訪問端口8081):8080(容器端口號)
docker ps 獲取tomcat正在運(yùn)行的容器id 進(jìn)入到中
docker exec -it 1210e05f1a59 bash

docker run -p 8081:8080 tomcat:8

-p 8081:8080 8081(linux虛擬機(jī)訪問的端口號):8080(容器內(nèi)部中端口號)

docker run -p 8081:8080 -d tomcat:8 后臺(tái)啟動(dòng) ---每次運(yùn)行都會(huì)創(chuàng)建一個(gè)新的容器

docker run --name mayikt-tomcat -p 8081:8080 -d tomcat:8

--name: 指定容器名稱
-p:指定容器端口號
-d:指定容器后臺(tái)運(yùn)行
docker run --name mayikt-tomcat tomcat

docker run --name mayikt-tomcat1 -p 8081:8080 tomcat
8081(容器外部或者linux虛擬機(jī)訪問的端口號 宿主機(jī))
8080 容器內(nèi)部的端口號
docker run --name mayikt-tomcat2022 -p 8081:8080 -d tomcat:8
-d 后臺(tái)啟動(dòng)
前臺(tái)啟動(dòng)與后臺(tái)啟動(dòng)的區(qū)別
前臺(tái)啟動(dòng)會(huì)打印啟動(dòng)日志信息
后臺(tái)啟動(dòng)不會(huì)打印啟動(dòng)日志信息

安裝Nginx實(shí)現(xiàn)靜態(tài)服務(wù)
Docker run 運(yùn)行容器

--name nginx-test:容器名稱。
-p 8080:80 端口進(jìn)行映射,將本地 8080 端口映射到容器內(nèi)部的 80 端口。
-d nginx: 設(shè)置容器在在后臺(tái)一直運(yùn)行。

docker ps --- 正在運(yùn)行的容器
docker ps -a 顯示所有的容器 包括為運(yùn)行的容器
docker ps 容器id

docker run --name nginx-mayikt -p 8080:80 nginx 默認(rèn)前臺(tái)啟動(dòng)
docker run --name nginx-mayikt -p 8080:80 -d nginx 后臺(tái)啟動(dòng)方式

前臺(tái)與后臺(tái)啟動(dòng)區(qū)別:

前臺(tái)啟動(dòng):會(huì)展示容器啟動(dòng)的日志信息-----
后臺(tái)啟動(dòng):不會(huì)展示啟動(dòng)日志信息

8080:80 8080 虛擬機(jī)本地端口 ---瀏覽器訪問 80 容器內(nèi)部端口
Elk+kafka---
systemctl stop firewalld

安裝MySQL5.7
1.查詢mysql版本
docker search mysql
2.下載MySQL5.7版本
docker pull mysql:5.7 (這里選擇的是第一個(gè)mysql鏡像, :5.7選擇的5.7版本)
3.等待下載完成、創(chuàng)建MySQL容器
docker create --name mysql3308 -e MYSQL_ROOT_PASSWORD=root -p 3308:3306 mysql:5.7
創(chuàng)建容器名稱為mysql3308,密碼為root

  1. 啟動(dòng)容器
    docker start mysql3308
  2. 進(jìn)入到容器
    docker exec -it mysql3308 bash
  3. mysql連接
    mysql -uroot –p
    Docker運(yùn)行底層原理
  4. 首先啟動(dòng)docker systemctl start docker
  5. Docker是一個(gè)CS架構(gòu)的系統(tǒng),docker守護(hù)進(jìn)程運(yùn)行在主機(jī)上,讓后通過socket連接
    從客戶端訪問,守護(hù)進(jìn)程從客戶端接收命令管理運(yùn)行在主機(jī)上的容器。
    ps aux | grep 'docker'

網(wǎng)站“bs”CS
數(shù)據(jù)卷volumes-from
容器間傳遞共享數(shù)據(jù)volumes-from

啟動(dòng)容器報(bào)錯(cuò)了如何解決?
先改為前臺(tái)啟動(dòng)如果沒有問題的情況下,在修改為后臺(tái)啟動(dòng)。
容器與容器局域網(wǎng)

DockerFile 解析

一個(gè)鏡像文件到底是如何創(chuàng)建?

  1. dockerfile 描述出鏡像文件需要的一些依賴配置和環(huán)境變量 執(zhí)行命令
  2. 將我們dockerfile 文件打包成一個(gè)鏡像文件
  3. 直接使用我們的容器運(yùn)行到該鏡像文件。
  1. 需要手動(dòng)編寫一個(gè)dockerfile文件
  2. 將該dockerfile docker build 自定義成一個(gè)鏡像文件
  3. docker run 運(yùn)行容器

Centos鏡像文件
docker run -it centos

https://github.com/CentOS/sig-cloud-instance-images/blob/b2d195220e1c5b181427c3172829c23ab9cd27eb/docker/Dockerfile

DockerFile編寫規(guī)范
A.#描述注釋
B.指令必須要大寫,后面至少需要帶至少一個(gè)參數(shù);
C.指令是按照從上到下,順序執(zhí)行;
DockerFile指令

  1. FROM 指定父鏡像: 基于哪個(gè)鏡像image構(gòu)建 指定基礎(chǔ)鏡像,必須為第一個(gè)命令
  2. MAINTAINER :維護(hù)者
  3. RUN: 容器創(chuàng)建的時(shí)候執(zhí)行一段命令 構(gòu)建鏡像時(shí)執(zhí)行的命令
  4. ADD: 將本地文件添加到容器中,tar類型文件會(huì)自動(dòng)解壓(網(wǎng)絡(luò)壓縮資源不會(huì)被解壓),可以訪問網(wǎng)絡(luò)資源,類似wget
  5. COPY:功能類似ADD,但是是不會(huì)自動(dòng)解壓文件,也不能訪問網(wǎng)絡(luò)資源
  6. CMD:構(gòu)建容器后調(diào)用,也就是在容器啟動(dòng)時(shí)才進(jìn)行調(diào)用。 .sh執(zhí)行文件
  7. ENV: 設(shè)置環(huán)境變量
  8. EXPOSE: 指定于外界交互的端口
  9. VOLUME 用于指定持久化目錄
  10. WORKDIR 設(shè)置進(jìn)入容器時(shí)的路徑 默認(rèn)訪問的目錄
    Tomcat-----jdk環(huán)境

Tomcat docker File:
https://github.com/docker-library/tomcat/blob/385e8403a38fab7097d4c3fed2484caba7dfd099/8.5/jdk8/openjdk-slim-buster/Dockerfile

https://github.com/docker-library/redis/blob/231905d0841f52ee4f3a5b8b42d62cd6d14a1a93/6.2/Dock

進(jìn)入tomcat 容器----/data
redis容器/data
/
DockerFile案例
Base鏡像(scratch) docker hub中的鏡像都是通過base鏡像中安裝和配置需要的軟件構(gòu)建的。
構(gòu)建自己centos鏡像
docker run -it centos

  1. 需求定制修改centos根目錄;
  2. 實(shí)現(xiàn)支持vim插件;

yum -y install vim

  1. 需要自己制作一個(gè)dockerfile文件
  2. 繼承docker hub中的centos
  3. 在docker hubcentos 上加入以下兩個(gè)功能
    A.進(jìn)入容器中 默認(rèn)訪問目錄/usr
    B.實(shí)現(xiàn)支持vim插件

需要將該dockerfile文件打包成一個(gè)鏡像文件 交給我們?nèi)萜鲌?zhí)行

https://github.com/CentOS/sig-cloud-instance-images/blob/b2d195220e1c5b181427c3172829c23ab9cd27eb/docker/Dockerfile

定制CentOS鏡像
FROM centos
MAINTAINER mayikt-yushengjun
ENV MYPATH /usr
WORKDIR $MYPATH
RUN yum -y install vim
EXPOSE 80
CMD /bin/bash

Dockerfile→使用docker 將該Dockerfile實(shí)現(xiàn)打包成鏡像文件→
容器運(yùn)行該鏡像文件。

docker build---將該Dockerfile實(shí)現(xiàn)打包成鏡像文件

將該dockerfile文件上傳到linux服務(wù)器中
使用docker build -f Dockerfile -t mycs:1 .
Dockerfile ------配置文件
mycs----打包鏡像文件名稱
1 tag 版本號碼

docker run -it mycs:1
將springboot項(xiàng)目打包部署

  1. 基于docker原生方式 部署我們的springboot項(xiàng)目
    Dockerfile
    2.dockercompose----- 容器編排技術(shù)

springboot項(xiàng)目----變成鏡像文件---容器運(yùn)行

  1. 將我們springboot項(xiàng)目---打成一個(gè)jar包

2.定義dockerfile文件-----描述出springboot項(xiàng)目 配置依賴和環(huán)境變量
JDK
注意:springboot內(nèi)置嵌入我們的tomcat服務(wù)器 所以不需要額外的tomcat容器來
運(yùn)行。
原生方式運(yùn)行我們的jar包
Java- jar指令

  1. 需要先將我們外部jar,拷貝到容器中
  2. 容器運(yùn)行成功執(zhí)行java -jar
    2.將該dockerfile文件打包成鏡像文件-
  1. 將springboot項(xiàng)目打包;

  2. 制作dockerfile文件;
    A. 繼承我們的jdk環(huán)境
    B. 將我們本地的jar包拷貝到容器中
    C. Java -jar

  3. 將dockerfile文件打包成鏡像文件;

  4. 運(yùn)行該鏡像文件即可;

將springboot項(xiàng)目打包
mvn clean package
制作dockerfile文件

基礎(chǔ)鏡像使用java

FROM java:8

作者

MAINTAINER www.mayikt.com

VOLUME 指定了臨時(shí)文件目錄為/tmp。

其效果是在主機(jī) /var/lib/docker 目錄下創(chuàng)建了一個(gè)臨時(shí)文件,并鏈接到容器的/tmp

VOLUME /tmp

將jar包添加到容器中并更名為mayikt.jar

ADD mayikt-thymeleaf-1.0-SNAPSHOT.jar mayikt.jar

運(yùn)行jar包

RUN bash -c 'touch /mayikt.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/mayikt.jar"]

暴露8080端口

EXPOSE 8080

打包成鏡像文件
docker build -f Dockerfile -t mayikt-member:1 .
docker build -f Dockerfile -t mayikt-member:1 .
啟動(dòng)容器
docker run -p 8070:8080 mayikt-member:1

訪問測試

Docker Compose

Sit pre prd環(huán)境
為什么需要使用Docker Compose
Docker Compose 容器編排技術(shù)

容器編排技術(shù)

1.現(xiàn)在我們有一個(gè)springboot項(xiàng)目,需要依賴Redis、mysql5.7、nginx。
如果使用docker原生部署的話,則需要安裝Redis、mysql5、nginx容器,在才可以啟動(dòng)我們springboot項(xiàng)目,這樣的話部署項(xiàng)目的流程非常復(fù)雜,所以需要引入我們的
Docker compose實(shí)現(xiàn)容器編排技術(shù)。

基本的概念
Docker-Compose項(xiàng)目是Docker官方的開源項(xiàng)目,負(fù)責(zé)實(shí)現(xiàn)對Docker容器集群的快速編排。
Docker-Compose將所管理的容器分為三層,分別是工程(project),服務(wù)(service)以及容器(container)。
開發(fā)一個(gè)springboot項(xiàng)目---大工程

  1. 依賴mysql
  2. 依賴redis
  3. 依賴zk
    等。
    需要在docker-compose.yml 配置項(xiàng)目工程依賴環(huán)境配置

Docker-Compose運(yùn)行目錄下的所有文件(docker-compose.yml,extends文件或環(huán)境變量文件等)組成一個(gè)工程,若無特殊指定工程名即為當(dāng)前目錄名。一個(gè)工程當(dāng)中可包含多個(gè)服務(wù),每個(gè)服務(wù)中定義了容器運(yùn)行的鏡像,參數(shù),依賴。一個(gè)服務(wù)當(dāng)中可包括多個(gè)容器實(shí)例,Docker-Compose并沒有解決負(fù)載均衡的問題,因此需要借助其它工具實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)及負(fù)載均衡。

Docker-Compose的工程配置文件默認(rèn)為docker-compose.yml,可通過環(huán)境變量COMPOSE_FILE或-f參數(shù)自定義配置文件,其定義了多個(gè)有依賴關(guān)系的服務(wù)及每個(gè)服務(wù)運(yùn)行的容器。

Compose 中有兩個(gè)重要的概念:

服務(wù) (service) :一個(gè)應(yīng)用的容器,實(shí)際上可以包括若干運(yùn)行相同鏡像的容器實(shí)例。
項(xiàng)目 (project) :由一組關(guān)聯(lián)的應(yīng)用容器組成的一個(gè)完整業(yè)務(wù)單元,在 docker-compose.yml 文件中定義。
一個(gè)項(xiàng)目可以由多個(gè)服務(wù)(容器)關(guān)聯(lián)而成,Compose 面向項(xiàng)目進(jìn)行管理,通過子命令對項(xiàng)目中的一組容器進(jìn)行便捷地生命周期管理。

Compose 項(xiàng)目由 Python 編寫,實(shí)現(xiàn)上調(diào)用了 Docker 服務(wù)提供的 API 來對容器進(jìn)行管理。因此,只要所操作的平臺(tái)支持 Docker API,就可以在其上利用 Compose 來進(jìn)行編排管理。

Docker-Compose分成三層
1.項(xiàng)目層 springboot項(xiàng)目依賴于我們的mysql redis、nginx等 一個(gè)項(xiàng)目是由多個(gè)容器組成的。
2.服務(wù)層 運(yùn)行一個(gè)鏡像的實(shí)例 ---

Compose環(huán)境安裝(離線安裝)

  1. 訪問docker compose github 官網(wǎng)
  1. docker-compose-Linux-x86_64 上傳到服務(wù)器中,然后執(zhí)行如下命令將其移動(dòng)到/usr/local/bin/目錄中 并且更名為docker-compose
    mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
  2. 執(zhí)行如下命令:添加可執(zhí)行的權(quán)限
    sudo chmod +x /usr/local/bin/docker-compose
  3. 驗(yàn)證docker-compose
    docker-compose -v

Compose常用命令
docker-compose -h # 查看幫助

docker-compose up # 創(chuàng)建并運(yùn)行所有容器
docker-compose up -d # 創(chuàng)建并后臺(tái)運(yùn)行所有容器
docker-compose -f docker-compose.yml up -d # 指定模板
docker-compose down # 停止并刪除容器、網(wǎng)絡(luò)、卷、鏡像。

docker-compose logs # 查看容器輸出日志
docker-compose pull # 拉取依賴鏡像
dokcer-compose config # 檢查配置
dokcer-compose config -q # 檢查配置,有問題才有輸出

docker-compose restart # 重啟服務(wù)
docker-compose start # 啟動(dòng)服務(wù)
docker-compose stop # 停止服務(wù)

Compose入門案例

流程:

  1. 需要定義一個(gè)docker-compose.yml文件----工程
  2. 需要在docker-compose文件配置依賴服務(wù)
  3. docker-compose up 執(zhí)行該文件
  1. 創(chuàng)建一個(gè)docker-compose.yml;
  2. 定制docker-compose 內(nèi)容;
  3. 運(yùn)行 docker-compose up ;

version: '3.0'
services:
tomcat: ##服務(wù)名稱
image: tomcat:8 #鏡像文件名稱
ports:
- 8080:8080

Compose模板文件
version: '3.0'
services:
tomcat80: ##服務(wù)名稱
#container_name: tomcat8080 指定容器名稱
image: tomcat:8 #鏡像文件名稱 run images
ports: ###端口號的映射 -p
- 8080:8080
volumes: ## 數(shù)據(jù)源 宿主機(jī)與容器數(shù)據(jù)共享 -v
- /usr/tomcat/webapps:/usr/local/tomcat/webapps
networks: ###定義網(wǎng)絡(luò)的橋
- mayikt

tomcat81: ##服務(wù)名稱
#container_name: tomcat8080 指定容器名稱
image: tomcat:8 #鏡像文件名稱
ports: ###端口號的映射
- 8081:8080
volumes: ## 數(shù)據(jù)源 宿主機(jī)與容器數(shù)據(jù)共享
- /usr/tomcat/webapps:/usr/local/tomcat/webapps
networks:
- mayikt
networks: ## 定義服務(wù)的橋
mayikt:

Compose常用命令

docker-compose ps 列出項(xiàng)目中所有的容器
docker-compose stop 停止docker-compose
docker-compose logs 查看容器中日志信息
docker-compose pull 拉取服務(wù)依賴的鏡像

Compose常用配置

Image 鏡像名稱;
Build 根據(jù)docker file 打包 成鏡像;
Context 指定docker file文件位置;
Commond 使用command可以覆蓋容器啟動(dòng)后默認(rèn)執(zhí)行的命令;
Container_name 容器名稱;
depends_on 指定依賴那個(gè)服務(wù);
Ports 映射的端口號;
extra_hosts 會(huì)在/etc/hosts文件中添加一些記錄;
Volumes 持久化目錄;
volumes_from 從另外一個(gè)容器掛在數(shù)據(jù)卷;
Dns 設(shè)置dns

Compose部署springboot項(xiàng)目
定義Compose文件
version: "3.0"
services:
mysql: # mysql服務(wù)
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password #解決外部無法訪問
ports:
- "3306:3306" #容器端口映射到宿主機(jī)的端口
environment:
MYSQL_ROOT_PASSWORD: 'root'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'mayikt'
MYSQL_USER: 'mayikt'
MYSQL_PASSWORD: 'mayikt'
networks:
- mayikt_web
mayikt-web: #自己單獨(dú)的springboot項(xiàng)目
hostname: mayikt
build: ./ #需要構(gòu)建的Dockerfile文件
ports:
- "38000:8080" #容器端口映射到宿主機(jī)的端口
depends_on: #web服務(wù)依賴mysql服務(wù),要等mysql服務(wù)先啟動(dòng)
- mysql
networks:
- mayikt_web
networks: ## 定義服務(wù)的橋
mayikt_web:

Spring項(xiàng)目配置
spring:
profiles:
active: prd
datasource:
url: jdbc:mysql://mysql:3306/mayikt?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
server:

端口號

port: 8080
servlet:
##設(shè)置springboot項(xiàng)目訪問路徑
context-path: /mayikt

演示效果
http://192.168.163.129:38000/mayikt/insertUser?userName=mayikt&userAge=22

Docker可視化工具使用
Portainer
Portainer是一款Docker可視化管理工具,允許我們在網(wǎng)頁中方便的查看和管理Docker容器。
要使用Portainer很簡單,運(yùn)行下面兩條命令即可。這些命令會(huì)創(chuàng)建一個(gè)Portainer專用的卷,然后在8000和9000端口創(chuàng)建容器并運(yùn)行。

啟動(dòng):
docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

CentOS Docker 安裝
docker rm (docker ps -aq) docker stop(docker ps -q) & docker rm (docker ps -aq) ---刪除所有的容器 docker rmi(docker images -q)
docker network ls
Linux關(guān)閉防火墻命令
systemctl stop firewalld

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1.Docker基礎(chǔ)簡介 開源容器引擎,go語言編寫,遵循apache2.0協(xié)議開源 Docker是微服務(wù)階段產(chǎn)物...
    hadoop_a9bb閱讀 1,077評論 0 0
  • Docker應(yīng)用容器 1. 初識 Docker 我們寫的代碼會(huì)接觸到好幾個(gè)環(huán)境:開發(fā)環(huán)境、測試環(huán)境以及生產(chǎn)環(huán)境。 ...
    itlu閱讀 324評論 0 5
  • 轉(zhuǎn)載自:黑馬程序員java課程 一、系統(tǒng)發(fā)展趨勢:實(shí)體機(jī)——>虛擬機(jī)-——>容器 二、Docker簡介 1. Do...
    ThompsonHen閱讀 281評論 0 0
  • 一篇文章學(xué)會(huì)docker docker安裝 docker在線安裝 1.更新yum到最新 2.卸載舊版本 3.安裝需...
    饒一熊閱讀 794評論 0 1
  • Docker 容器本質(zhì)上是宿主機(jī)上的一個(gè)進(jìn)程。Docker 通過 namespace 實(shí)現(xiàn)了資源隔離,通過 cgr...
    Linux丶晨星閱讀 8,378評論 1 5