docker的使用
5.1從docker鏡像倉庫獲取鏡像的命令
docker pull [選項] [Docker Registry 地址[:端口號]/]倉庫名[:標(biāo)簽]
Docker 鏡像倉庫地址:地址的格式一般是 <域名/IP>[:端口號] 。默認(rèn)地址是 DockerHub。
下載gitlab鏡像
docker pull gitlab/gitlab-ce:latest
下載指定版本的ubuntu鏡像
?docker pull ubuntu:16.04
5.2 docker鏡像的使用
5.2.1后臺啟動一個docker容器
docker run –d –it <imagename>
5.2.2 只運行一次容器
docker run -it --rm ubuntu:16.04 bash
docker run 就是運行容器的命令,
說明一下上面用到的參數(shù)。
-it :這是兩個參數(shù),一個是 -i :交互式操作,一個是 -t 終端。我們這里打算進入
bash 執(zhí)行一些命令并查看返回結(jié)果,因此我們需要交互式終端。
--rm :這個參數(shù)是說容器退出后隨之將其刪除。默認(rèn)情況下,為了排障需求,退出的容器并不會立即刪除,除非手動 docker rm 。我們這里只是隨便執(zhí)行個命令,看看結(jié)果,不需要排障和保留結(jié)果,因此使用 --rm 可以避免浪費空間。
ubuntu:16.04 :這是指用 ubuntu:16.04 鏡像為基礎(chǔ)來啟動容器。
bash :放在鏡像名后的是命令,這里我們希望有個交互式 Shell,因此用的是 bash 。
5.2.3在運行狀態(tài)的容器里啟動一個bash
docker ?exec ?-it ?$container_id ?bash
5.2.4啟動mysql鏡像的時候設(shè)置mysql的密碼
docker run -d -P -e MYSQL_ROOT_PASSWORD=root mysql
登錄mysql容器
docker run -it –-rm mysql mysql –u root –p root
5.2.5啟動gitlab容器
docker pull gitlab/gitlab-ce
docker run --name='gitlab-ce' -d -p 10022:22 -p 8999:80 --restart always?? gitlab/gitlab-ce
-p 用來指定docker容器映射宿主機的服務(wù)端口。80是web訪問用的端口,22是ssh協(xié)議用的端口,在啟動過程中g(shù)itlab容器初始化需要一段時間
5.2.6重啟容器
?docker restart $container_id
5.2.7列出docker中的鏡像
docker image list
5.2.8查看鏡像、容器、數(shù)據(jù)卷所占用的空間
docker system df
5.2.9查看虛懸鏡像
docker image ls -f dangling=true
5.2.10刪除虛懸鏡像
docker image prune
5.2.11列出docker容器中的頂層鏡像
docker image ls
5.2.12列出docker中所有鏡像
docker image ls -a
5.2.13查看正在運行的容器
docker?ps
5.2.14查看所有容器,包括停止的
docker?ps -a
5.2.15查看最新創(chuàng)建的容器
docker?ps -l
5.2.16查看最新創(chuàng)建的x個容器
docker?ps -n=2
5.2.17列出某一個特定鏡像
docker image ls xxx(鏡像名稱)
5.2.18查看某個鏡像某個版本之后的鏡像
docker image ls -f since=mongo:3.2
docker image ls -f before=mongo:3.2
5.2.19列出鏡像的id
docker image ls -q
5.2.20列出鏡像的id以及名稱
docker image ls --format “{{.ID}}:{{.Repository}}”
以表格等距顯示,并且有標(biāo)題行
docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
5.2.21刪除本地鏡像
如果要刪除本地的鏡像,可以使用 docker image rm 命令,其格式為:
$ docker image rm 鏡像名稱/短id
如果有兩個相同id的鏡像存在,可以使用docker image rmi –f <imageid>
5.2.22列出某一倉庫所有的鏡像
docker image ls -q XXXX(倉庫名)
5.2.23刪除某一倉庫的鏡像
docker image rm $(docker image ls -q redis)
鏡像是容器的基礎(chǔ),每次執(zhí)行 docker run 的時候都會指定哪個鏡像作為容器運行的基礎(chǔ)。
5.2.24定制web服務(wù)器的例子
docker run --name webserver -d -p 80:80 nginx
端口號1:端口號2 其中端口號2為容器內(nèi)部端口號,其中端口號1為宿主機端口號
5.2.25可以使用dockerfile定制鏡像
在一個空白目錄中,建立一個文本文件,并命名為 Dockerfile :
$ mkdir mynginx
$ cd mynginx
$ touch Dockerfile
在Dockeerfile文件中寫入如下內(nèi)容
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
from指定基礎(chǔ)鏡像
RUN 指令是用來執(zhí)行命令行命令的
在Dockerfile所在目錄下執(zhí)行
docker build -t nginx:v3 .
會看到如下輸出
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM nginx
---> e43d811ce2f4
Step 2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
---> Running in 9cdc27646c7b
---> 44aa4490ce2c
Removing intermediate container 9cdc27646c7b
Successfully built 44aa4490ce2c
docker build的指令
這里我們使用了 docker build 命令進行鏡像構(gòu)建。其格式為:
docker build [選項] <上下文路徑/URL/->
5.2.26容器的導(dǎo)出
docker?export containerid >?導(dǎo)出的文件壓縮包
5.2.27容器的導(dǎo)入
docker?import? -?新鏡像名 <文件名稱
5.2.28鏡像的備份與恢復(fù):
docker?save -o?備份鏡像名稱?已經(jīng)存在的鏡像
查看是否已經(jīng)備份成功?ls
刪除備份的鏡像?docker?rmi?備份的鏡像名稱
導(dǎo)入備份的鏡像?docker?load <備份的鏡像名稱
5.2.29網(wǎng)絡(luò)端口的快捷方式
通過docker?ps可以查看正在運行的容器,同時可以查看容器的端口映射
5.2.30查看web應(yīng)用程序的日志
可以查看容器內(nèi)部的標(biāo)準(zhǔn)輸出
docker logs[id或者名字]
查看web應(yīng)用程序容器的進程
docker top [容器名或id]
檢查web應(yīng)用程序
docker inspect <鏡像名>
5.2.31 容器的啟動與停止
docker? stop?容器名或ID? ?停止容器
docker? start?容器名或ID? ?啟動容器
docker? rm? ? 容器名或ID? ?刪除容器時,容器必須停止
5.2.32容器的查找:
docker search?容器名或id
5.2.33從主機往容器中拷貝
將主機/www/runoob目錄拷貝到容器96f7f14e99ab的/www目錄下。
docker cp /www/runoob 96f7f14e99ab:/www/
2、將容器中文件拷往主機
將容器96f7f14e99ab的/www目錄拷貝到主機的/tmp目錄中。
docker cp? 96f7f14e99ab:/www /tmp/
將主機/www/runoob目錄拷貝到容器96f7f14e99ab中,目錄重命名為www。
docker cp /www/runoob 96f7f14e99ab:/www
5.2.34 docker容器的自啟動
在容器退出或斷電開機后,docker可以通過在容器創(chuàng)建時的--restart參數(shù)來指定重啟策略;
# 多個參數(shù)值選擇
no? 不自動重啟容器. (默認(rèn)value)
on-failure? 容器發(fā)生error而退出(容器退出狀態(tài)不為0)重啟容器,可以指定重啟的最大次數(shù),如:on-failure:10
unless-stopped? 在容器已經(jīng)stop掉或Docker stoped/restarted的時候才重啟容器
always? 在容器已經(jīng)stop掉或Docker stoped/restarted的時候才重啟容器,手動stop的不算
例如:
# 設(shè)置啟動策略
docker run --restart always --name mynginx -d nginx
如果容器已經(jīng)被創(chuàng)建,需要修改策略
docker update --restart no mynginx
5.2.35 建立本地倉庫
建立本地倉庫,首先下載registry鏡像
docker pull registry
默認(rèn)情況下,會將倉庫存放于容器內(nèi)的/var/lib/registry目錄下,這樣如果容器被刪除,則存放于容器中的鏡像也會丟失,所以我們一般情況下會指定本地一個目錄(剛剛創(chuàng)建的/home/docker_registry)掛載到容器內(nèi)的/var/lib/registry下,如下:
docker run -d -p 5000:5000 -v /home/docker_registry: /var/lib/registry registry
至此我們就創(chuàng)建了一個私有倉庫,地址在本機的5000端口上,我的是192.168.248.132,即:192.168.248.132:5000
測試調(diào)試
把一個本地鏡像push到私有倉庫中
在一臺裝有docker的機器下pull一個比較小的鏡像來測試
docker pull busybox
接下來修改一下該鏡像的tag
docker tag busybox 192.168.248.132:5000/busybox
接下來把打了tag的鏡像上傳到私有倉庫
docker push 192.168.2.114:5000/busybox
此時報錯
The push refers to repository
[192.168.248.132:5000/busybox]
Get http://192.168.248.132:5000/v2/: dial tcp 192.168.248.132:5000: connect: connection refused
因為Docker從1.3.X之后,與docker registry交互默認(rèn)使用的是https,然而此處搭建的私有倉庫只提供http服務(wù),所以當(dāng)與私有倉庫交互時就會報上面的錯誤。
為了解決這個問題需要在啟動docker server時增加啟動參數(shù)為默認(rèn)使用http訪問。修改docker啟動配置文件:
vim? /usr/lib/systemd/system/docker.service
找到?ExecStart,修改為如下內(nèi)容
ExecStart=/usr/bin/dockerd? --insecure-registry 192.168.248.132:5000
重啟docker:
systemctl daemon-reload
systemctl restart docker
然后上傳成功
docker push 192.168.248.132:5000/busybox
進行驗證從私有倉庫pull下該鏡像
docker pull 192.168.248.132:5000/busybox
備注:
鏡像的存儲路徑 /var/lib/docker,當(dāng)碰到打算刪除掉docker鏡像但是發(fā)現(xiàn)有幾個鏡像就是刪除不了,加了-f強制刪除也不行,一直報Error: No such container的錯誤,最后終于找到了辦法直接刪除文件
停掉docker服務(wù),systemctl stop docker
刪除文件 rm –rf /var/lib/docker
5.2.36 對現(xiàn)有鏡像進行修改,如安裝包,修改配置文件以后做出新的鏡像
[root@localhost containers]# docker images
REPOSITORY????????? TAG???????????????? IMAGE ID??????????? CREATED???????????? SIZE
centos????????????? v1????????????????? e726f783613f??????? 2 minutes ago?????? 336MB
tomcat????????????? latest????????????? dd6ff929584a??????? 42 hours ago??????? 463MB
mysql?????????????? latest????????????? 91dadee7afee??????? 2 days ago????????? 477MB
centos????????????? latest????????????? 1e1148e4cc2c??????? 3 months ago??????? 202MB
首先登陸要修改的容器
docker run -d -it 1e1148e4cc2c
安裝依賴包
yum install vim net-tools telnet –y
安裝成功以后退出該容器
然后執(zhí)行如下指令
[root@localhost ~]# docker commit 5fc7cd5223a9(容器id) centos:v1
這樣就將修改的容器重新打包鏡像進行上傳
通過docker images可以看到新的鏡像文件
5.2.37 實現(xiàn)docker容器與本地卷的掛載
[root@localhost ~]# docker images
REPOSITORY????????? TAG???????????????? IMAGE ID??????????? CREATED???????????? SIZE
centos????????????? latest????????????? 9f38484d220f??????? 2 weeks ago???????? 202MB
centos????????????? v1????????????????? e726f783613f??????? 3 weeks ago???????? 336MB
tomcat????????????? latest????????????? dd6ff929584a??????? 3 weeks ago???????? 463MB
mysql?????????????? latest????????????? 91dadee7afee??????? 3 weeks ago???????? 477MB
centos????????????? ????????????? 1e1148e4cc2c??????? 3 months ago??????? 202MB
[root@localhost ~]# docker run -it -d --name lvm -v /data:/data 9f38484d220f
31f66d1fb09534c04b7cc6bee200025a50ea39e01835fd07ac89ace30206e534
[root@localhost ~]# docker ps
CONTAINER ID??????? IMAGE?????????????? COMMAND???????????? CREATED???????????? STATUS????????????? PORTS?????????????? NAMES
31f66d1fb095??????? 9f38484d220f??????? "/bin/bash"???????? 5 seconds ago?????? Up 3 seconds??????????????????????????? lvm
其中掛載目錄的對應(yīng)關(guān)系為“宿主機對應(yīng)存在的目錄:容器對應(yīng)存在的目錄”,這要求宿主機的掛載目錄已經(jīng)并且必須存在,容器中的目錄會相應(yīng)的進行創(chuàng)建