目錄
一.基本操作
1.鏡像操作
1.1.鏡像名稱
1.2.鏡像命令
1.3.案例-拉取、查看鏡像
1.4.案例-保存、導(dǎo)入鏡像
2.容器操作
2.1.容器相關(guān)命令
2.2.案例-創(chuàng)建并運(yùn)行一個(gè)容器
2.3.案例-進(jìn)入容器,修改文件
2.4.小結(jié)
3.數(shù)據(jù)卷(容器數(shù)據(jù)管理)
3.1.什么是數(shù)據(jù)卷
3.2.數(shù)據(jù)集操作命令
3.3.創(chuàng)建和查看數(shù)據(jù)卷
3.4.掛載數(shù)據(jù)卷
3.5.案例-給nginx掛載數(shù)據(jù)卷
3.6.案例-給MySQL掛載本地目錄
3.7.小結(jié)
二.Dockerfile自定義鏡像
1.鏡像結(jié)構(gòu)
2.Dockerfile語法
3.構(gòu)建Java項(xiàng)目
3.1.基于Ubuntu構(gòu)建Java項(xiàng)目
3.2.基于java8構(gòu)建Java項(xiàng)目
4.小結(jié)
三.Docker-Compose
1.初識(shí)DockerCompose
2.安裝DockerCompose
四.Docker鏡像倉庫
1.搭建私有鏡像倉庫
2.推送、拉取鏡像
一.基本操作
1.鏡像操作
1.1.鏡像名稱
首先來看下鏡像的名稱組成:
-
鏡名稱一般分兩部分組成:[repository]:[tag]。
-
在沒有指定tag時(shí),默認(rèn)是latest,代表最新版本的鏡像
如圖:
?這里的mysql就是repository,5.7就是tag,合一起就是鏡像名稱,代表5.7版本的MySQL鏡像。 ?
1.2.鏡像命令
常見的鏡像操作命令如圖:
1.3.案例-拉取、查看鏡像
需求:從DockerHub中拉取一個(gè)nginx鏡像并查看
1)首先去鏡像倉庫搜索nginx鏡像,比如DockerHub:
?2)根據(jù)查看到的鏡像名稱,拉取自己需要的鏡像,通過命令:
? docker pull nginx ?
3)查看拉取到的鏡像,通過命令:
? docker images
1.4.案例-保存、導(dǎo)入鏡像
需求:利用docker save將nginx鏡像導(dǎo)出磁盤,然后再通過load加載回來
1)利用docker xx --help命令查看docker save和docker load的語法
例如,查看save命令用法,可以輸入命令:
docker save --help
結(jié)果: ?
?命令格式:
docker save -o [保存的目標(biāo)文件名稱] [鏡像名稱]
2)使用docker save導(dǎo)出鏡像到磁盤
運(yùn)行命令:
docker save -o nginx.tar nginx:latest
結(jié)果如圖: ?
3)使用docker load加載鏡像
先刪除本地的nginx鏡像:
docker rmi nginx:latest
然后運(yùn)行命令,加載本地文件:
docker load -i nginx.tar
結(jié)果:
2.容器操作
2.1.容器相關(guān)命令
容器操作的命令如圖:
容器保護(hù)三個(gè)狀態(tài):
-
運(yùn)行:進(jìn)程正常運(yùn)行
-
暫停:進(jìn)程暫停,CPU不再運(yùn)行,并不釋放內(nèi)存
-
停止:進(jìn)程終止,回收進(jìn)程占用的內(nèi)存、CPU等資源
其中:
-
docker run:創(chuàng)建并運(yùn)行一個(gè)容器,處于運(yùn)行狀態(tài)
-
docker pause:讓一個(gè)運(yùn)行的容器暫停
-
docker unpause:讓一個(gè)容器從暫停狀態(tài)恢復(fù)運(yùn)行
-
docker stop:停止一個(gè)運(yùn)行的容器
-
docker start:讓一個(gè)停止的容器再次運(yùn)行
-
docker rm:刪除一個(gè)容器
2.2.案例-創(chuàng)建并運(yùn)行一個(gè)容器
創(chuàng)建并運(yùn)行nginx容器的命令:
docker run --name containerName -p 80:80 -d nginx
命令解讀:
-
docker run :創(chuàng)建并運(yùn)行一個(gè)容器
-
--name : 給容器起一個(gè)名字,比如叫做mn
-
-p :將宿主機(jī)端口與容器端口映射,冒號(hào)左側(cè)是宿主機(jī)端口,右側(cè)是容器端口
-
-d:后臺(tái)運(yùn)行容器
-
nginx:鏡像名稱,例如nginx
這里的-p
參數(shù),是將容器端口映射到宿主機(jī)端口。
默認(rèn)情況下,容器是隔離環(huán)境,我們直接訪問宿主機(jī)的80端口,肯定訪問不到容器中的nginx。
現(xiàn)在,將容器的80與宿主機(jī)的80關(guān)聯(lián)起來,當(dāng)我們?cè)L問宿主機(jī)的80端口時(shí),就會(huì)被映射到容器的80,這樣就能訪問到nginx了:
2.3.案例-進(jìn)入容器,修改文件
需求:進(jìn)入Nginx容器,修改HTML文件內(nèi)容,添加“傳智教育歡迎您”
提示:進(jìn)入容器要用到docker exec命令。
步驟:
1)進(jìn)入容器。進(jìn)入我們剛剛創(chuàng)建的nginx容器的命令為:
docker exec -it mn bash
命令解讀:
-
docker exec :進(jìn)入容器內(nèi)部,執(zhí)行一個(gè)命令
-
-it : 給當(dāng)前進(jìn)入的容器創(chuàng)建一個(gè)標(biāo)準(zhǔn)輸入、輸出終端,允許我們與容器交互
-
mn :要進(jìn)入的容器的名稱
-
bash:進(jìn)入容器后執(zhí)行的命令,bash是一個(gè)linux終端交互命令
2)進(jìn)入nginx的HTML所在目錄 /usr/share/nginx/html
容器內(nèi)部會(huì)模擬一個(gè)獨(dú)立的Linux文件系統(tǒng),看起來如同一個(gè)linux服務(wù)器一樣:
nginx的環(huán)境、配置、運(yùn)行文件全部都在這個(gè)文件系統(tǒng)中,包括我們要修改的html文件。
查看DockerHub網(wǎng)站中的nginx頁面,可以知道nginx的html目錄位置在/usr/share/nginx/html
我們執(zhí)行命令,進(jìn)入該目錄:
cd /usr/share/nginx/html
查看目錄下文件:
?3)修改index.html的內(nèi)容
容器內(nèi)沒有vi命令,無法直接修改,我們用下面的命令來修改:
sed -i -e 's#Welcome to nginx#歡迎您#g' -e 's#<head>#<head><meta charset="utf-8">#g' index.html
在瀏覽器訪問自己的虛擬機(jī)地址,例如我的是:http://192.168.150.101,即可看到結(jié)果:
2.4.小結(jié)
docker run命令的常見參數(shù)有哪些?
-
--name:指定容器名稱
-
-p:指定端口映射
-
-d:讓容器后臺(tái)運(yùn)行
查看容器日志的命令:
-
docker logs
-
添加 -f 參數(shù)可以持續(xù)查看日志
查看容器狀態(tài):
-
docker ps
-
docker ps -a 查看所有容器,包括已經(jīng)停止的
3.數(shù)據(jù)卷(容器數(shù)據(jù)管理)
在之前的nginx案例中,修改nginx的html頁面時(shí),需要進(jìn)入nginx內(nèi)部。并且因?yàn)闆]有編輯器,修改文件也很麻煩。
這就是因?yàn)槿萜髋c數(shù)據(jù)(容器內(nèi)文件)耦合帶來的后果。
?
要解決這個(gè)問題,必須將數(shù)據(jù)與容器解耦,這就要用到數(shù)據(jù)卷了。
3.1.什么是數(shù)據(jù)卷
數(shù)據(jù)卷(volume)是一個(gè)虛擬目錄,指向宿主機(jī)文件系統(tǒng)中的某個(gè)目錄。
一旦完成數(shù)據(jù)卷掛載,對(duì)容器的一切操作都會(huì)作用在數(shù)據(jù)卷對(duì)應(yīng)的宿主機(jī)目錄了。
這樣,我們操作宿主機(jī)的/var/lib/docker/volumes/html目錄,就等于操作容器內(nèi)的/usr/share/nginx/html目錄了
3.2.數(shù)據(jù)集操作命令
數(shù)據(jù)卷操作的基本語法如下:
docker volume [COMMAND]
docker volume命令是數(shù)據(jù)卷操作,根據(jù)命令后跟隨的command來確定下一步的操作:
-
create 創(chuàng)建一個(gè)volume
-
inspect 顯示一個(gè)或多個(gè)volume的信息
-
ls 列出所有的volume
-
prune 刪除未使用的volume
-
rm 刪除一個(gè)或多個(gè)指定的volume
3.3.創(chuàng)建和查看數(shù)據(jù)卷
需求:創(chuàng)建一個(gè)數(shù)據(jù)卷,并查看數(shù)據(jù)卷在宿主機(jī)的目錄位置
① 創(chuàng)建數(shù)據(jù)卷
docker volume create html
② 查看所有數(shù)據(jù)
docker volume ls
結(jié)果:
③ 查看數(shù)據(jù)卷詳細(xì)信息卷
docker volume inspect html
結(jié)果:
?
?可以看到,我們創(chuàng)建的html這個(gè)數(shù)據(jù)卷關(guān)聯(lián)的宿主機(jī)目錄為/var/lib/docker/volumes/html/_data
目錄。
小結(jié):
數(shù)據(jù)卷的作用:
-
將容器與數(shù)據(jù)分離,解耦合,方便操作容器內(nèi)數(shù)據(jù),保證數(shù)據(jù)安全
數(shù)據(jù)卷操作:
-
docker volume create:創(chuàng)建數(shù)據(jù)卷
-
docker volume ls:查看所有數(shù)據(jù)卷
-
docker volume inspect:查看數(shù)據(jù)卷詳細(xì)信息,包括關(guān)聯(lián)的宿主機(jī)目錄位置
-
docker volume rm:刪除指定數(shù)據(jù)卷
-
docker volume prune:刪除所有未使用的數(shù)據(jù)卷
3.4.掛載數(shù)據(jù)卷
我們?cè)趧?chuàng)建容器時(shí),可以通過 -v 參數(shù)來掛載一個(gè)數(shù)據(jù)卷到某個(gè)容器內(nèi)目錄,命令格式如下:
docker run \
?--name mn \
?-v html:/root/html \
?-p 8080:80
? nginx \
這里的-v就是掛載數(shù)據(jù)卷的命令:
-
-v html:/root/htm
:把html數(shù)據(jù)卷掛載到容器內(nèi)的/root/html這個(gè)目錄中
3.5.案例-給nginx掛載數(shù)據(jù)卷
需求:創(chuàng)建一個(gè)nginx容器,修改容器內(nèi)的html目錄內(nèi)的index.html內(nèi)容
分析:上個(gè)案例中,我們進(jìn)入nginx容器內(nèi)部,已經(jīng)知道nginx的html目錄所在位置/usr/share/nginx/html ,我們需要把這個(gè)目錄掛載到html這個(gè)數(shù)據(jù)卷上,方便操作其中的內(nèi)容。
提示:運(yùn)行容器時(shí)使用 -v 參數(shù)掛載數(shù)據(jù)卷
步驟:
① 創(chuàng)建容器并掛載數(shù)據(jù)卷到容器內(nèi)的HTML目錄
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
② 進(jìn)入html數(shù)據(jù)卷所在位置,并修改HTML內(nèi)容
# 查看html數(shù)據(jù)卷的位置
docker volume inspect html
# 進(jìn)入該目錄
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html
3.6.案例-給MySQL掛載本地目錄
容器不僅僅可以掛載數(shù)據(jù)卷,也可以直接掛載到宿主機(jī)目錄上。關(guān)聯(lián)關(guān)系如下:
-
帶數(shù)據(jù)卷模式:宿主機(jī)目錄 --> 數(shù)據(jù)卷 ---> 容器內(nèi)目錄
-
直接掛載模式:宿主機(jī)目錄 ---> 容器內(nèi)目錄
如圖:
語法:
目錄掛載與數(shù)據(jù)卷掛載的語法是類似的:
-
-v [宿主機(jī)目錄]:[容器內(nèi)目錄]
-
-v [宿主機(jī)文件]:[容器內(nèi)文件]
需求:創(chuàng)建并運(yùn)行一個(gè)MySQL容器,將宿主機(jī)目錄直接掛載到容器
實(shí)現(xiàn)思路如下:
1)在將課前資料中的mysql.tar文件上傳到虛擬機(jī),通過load命令加載為鏡像
2)創(chuàng)建目錄/tmp/mysql/data
3)創(chuàng)建目錄/tmp/mysql/conf,將課前資料提供的hmy.cnf文件上傳到/tmp/mysql/conf
4)去DockerHub查閱資料,創(chuàng)建并運(yùn)行MySQL容器,要求:
① 掛載/tmp/mysql/data到mysql容器內(nèi)數(shù)據(jù)存儲(chǔ)目錄
② 掛載/tmp/mysql/conf/hmy.cnf到mysql容器的配置文件
③ 設(shè)置MySQL密碼
3.7.小結(jié)
docker run的命令中通過 -v 參數(shù)掛載文件或目錄到容器中:
-
-v volume名稱:容器內(nèi)目錄
-
-v 宿主機(jī)文件:容器內(nèi)文
-
-v 宿主機(jī)目錄:容器內(nèi)目錄
數(shù)據(jù)卷掛載與目錄直接掛載的區(qū)別
-
數(shù)據(jù)卷掛載耦合度低,由docker來管理目錄,但是目錄較深,不好找
-
目錄掛載耦合度高,需要我們自己管理目錄,不過目錄容易尋找查看
二.Dockerfile自定義鏡像
常見的鏡像在DockerHub就能找到,但是我們自己寫的項(xiàng)目就必須自己構(gòu)建鏡像了。
而要自定義鏡像,就必須先了解鏡像的結(jié)構(gòu)才行。
1.鏡像結(jié)構(gòu)
鏡像是將應(yīng)用程序及其需要的系統(tǒng)函數(shù)庫、環(huán)境、配置、依賴打包而成。
我們以MySQL為例,來看看鏡像的組成結(jié)構(gòu):
?
簡(jiǎn)單來說,鏡像就是在系統(tǒng)函數(shù)庫、運(yùn)行環(huán)境基礎(chǔ)上,添加應(yīng)用程序文件、配置文件、依賴文件等組合,然后編寫好啟動(dòng)腳本打包在一起形成的文件。
我們要構(gòu)建鏡像,其實(shí)就是實(shí)現(xiàn)上述打包的過程。
2.Dockerfile語法
構(gòu)建自定義的鏡像時(shí),并不需要一個(gè)個(gè)文件去拷貝,打包。
我們只需要告訴Docker,我們的鏡像的組成,需要哪些BaseImage、需要拷貝什么文件、需要安裝什么依賴、啟動(dòng)腳本是什么,將來Docker會(huì)幫助我們構(gòu)建鏡像。
而描述上述信息的文件就是Dockerfile文件。
Dockerfile就是一個(gè)文本文件,其中包含一個(gè)個(gè)的指令(Instruction),用指令來說明要執(zhí)行什么操作來構(gòu)建鏡像。每一個(gè)指令都會(huì)形成一層Layer。
?更新詳細(xì)語法說明,請(qǐng)參考官網(wǎng)文檔: Dockerfile reference | Docker Documentation
3.構(gòu)建Java項(xiàng)目
3.1.基于Ubuntu構(gòu)建Java項(xiàng)目
需求:基于Ubuntu鏡像構(gòu)建一個(gè)新鏡像,運(yùn)行一個(gè)java項(xiàng)目
-
步驟1:新建一個(gè)空文件夾docker-demo
- ?步驟2:拷貝課前資料中的docker-demo.jar文件到docker-demo這個(gè)目錄
-
?步驟3:拷貝課前資料中的jdk8.tar.gz文件到docker-demo這個(gè)目錄
- 步驟4:拷貝課前資料提供的Dockerfile到docker-demo這個(gè)目錄
?其中的內(nèi)容如下:
# 指定基礎(chǔ)鏡像
FROM ubuntu:16.04
# 配置環(huán)境變量,JDK的安裝目錄
ENV JAVA_DIR=/usr/local# 拷貝jdk和java項(xiàng)目的包
COPY ./jdk8.tar.gz $JAVA_DIR/
COPY ./docker-demo.jar /tmp/app.jar# 安裝JDK
RUN cd $JAVA_DIR \
?&& tar -xf ./jdk8.tar.gz \
?&& mv ./jdk1.8.0_144 ./java8# 配置環(huán)境變量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/bin# 暴露端口
EXPOSE 8090
# 入口,java項(xiàng)目的啟動(dòng)命令
ENTRYPOINT java -jar /tmp/app.jar
-
步驟5:進(jìn)入docker-demo
將準(zhǔn)備好的docker-demo上傳到虛擬機(jī)任意目錄,然后進(jìn)入docker-demo目錄下
-
步驟6:運(yùn)行命令:
docker build -t javaweb:1.0 .
最后訪問 http://192.168.150.101:8090/hello/count,其中的ip改成你的虛擬機(jī)ip
3.2.基于java8構(gòu)建Java項(xiàng)目
雖然我們可以基于Ubuntu基礎(chǔ)鏡像,添加任意自己需要的安裝包,構(gòu)建鏡像,但是卻比較麻煩。所以大多數(shù)情況下,我們都可以在一些安裝了部分軟件的基礎(chǔ)鏡像上做改造。
例如,構(gòu)建java項(xiàng)目的鏡像,可以在已經(jīng)準(zhǔn)備了JDK的基礎(chǔ)鏡像基礎(chǔ)上構(gòu)建。
需求:基于java:8-alpine鏡像,將一個(gè)Java項(xiàng)目構(gòu)建為鏡像
實(shí)現(xiàn)思路如下:
-
① 新建一個(gè)空的目錄,然后在目錄中新建一個(gè)文件,命名為Dockerfile
-
② 拷貝課前資料提供的docker-demo.jar到這個(gè)目錄中
-
③ 編寫Dockerfile文件:
-
a )基于java:8-alpine作為基礎(chǔ)鏡像
-
b )將app.jar拷貝到鏡像中
-
c )暴露端口
-
d )編寫入口ENTRYPOINT
內(nèi)容如下:
FROM java:8-alpine
COPY ./app.jar /tmp/app.jar
EXPOSE 8090
ENTRYPOINT java -jar /tmp/app.jar
-
-
④ 使用docker build命令構(gòu)建鏡像
-
⑤ 使用docker run創(chuàng)建容器并運(yùn)行
4.小結(jié)
小結(jié):
-
Dockerfile的本質(zhì)是一個(gè)文件,通過指令描述鏡像的構(gòu)建過程
-
Dockerfile的第一行必須是FROM,從一個(gè)基礎(chǔ)鏡像來構(gòu)建
-
基礎(chǔ)鏡像可以是基本操作系統(tǒng),如Ubuntu。也可以是其他人制作好的鏡像,例如:java:8-alpine
三.Docker-Compose
Docker Compose可以基于Compose文件幫我們快速的部署分布式應(yīng)用,而無需手動(dòng)一個(gè)個(gè)創(chuàng)建和運(yùn)行容器! ?
1.初識(shí)DockerCompose
Compose文件是一個(gè)文本文件,通過指令定義集群中的每個(gè)容器如何運(yùn)行。格式如下:
version:?"3.8"
?services:
??mysql:
????image:?mysql:5.7.25
? ? environment:
? ? ?MYSQL_ROOT_PASSWORD: 123?
????volumes:
?????-?"/tmp/mysql/data:/var/lib/mysql"
?????-?"/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"
??web:
????build:?.
????ports:
?????- "8090:8090"
上面的Compose文件就描述一個(gè)項(xiàng)目,其中包含兩個(gè)容器:
-
mysql:一個(gè)基于
mysql:5.7.25
鏡像構(gòu)建的容器,并且掛載了兩個(gè)目錄 -
web:一個(gè)基于
docker build
臨時(shí)構(gòu)建的鏡像容器,映射端口時(shí)8090
DockerCompose的詳細(xì)語法參考官網(wǎng):Overview | Docker Documentation
其實(shí)DockerCompose文件可以看做是將多個(gè)docker run命令寫到一個(gè)文件,只是語法稍有差異。
2.安裝DockerCompose
安裝DockerCompose
四.Docker鏡像倉庫
1.搭建私有鏡像倉庫
Docker搭建私有倉庫
2.推送、拉取鏡像
推送鏡像到私有鏡像服務(wù)必須先tag,步驟如下:
① 重新tag本地鏡像,名稱前綴為私有倉庫的地址:192.168.150.101:8080/
docker tag nginx:latest 192.168.150.101:8080/nginx:1.0?
② 推送鏡像
docker push 192.168.150.101:8080/nginx:1.0?
③ 拉取鏡像文章來源:http://www.zghlxwxcb.cn/news/detail-772349.html
docker pull 192.168.150.101:8080/nginx:1.0?文章來源地址http://www.zghlxwxcb.cn/news/detail-772349.html
到了這里,關(guān)于Docker基本操作&與自定義鏡像&Docker-Compose與Docker鏡像倉庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!