容器創建
我們已經知道,鏡像是只讀的,而基於鏡像創建出來的容器是可讀寫的,所以,一般我們實際中,會經常使用對應鏡像創建容器並且使用這些容器。同樣,如果我們想要使用容器,那么我們必須首先需要創建容器。而且要知道一個鏡像可以同時創建多個容器
[root@206 /]# docker run -t -i ubuntu:17.10 /bin/bash
容器的啟動
容器的啟動主要分為兩種方式:
exit之后就是終止狀態
[root@206 /]# docker run -t -i ubuntu:17.10 /bin/bash
root@abc6e11de34e:/# exit
exit
查看docker上所有的容器
[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abc6e11de34e ubuntu:17.10 "/bin/bash" 11 minutes ago Exited (0) 50 seconds ago ecstatic_meitner bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky 2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago amazing_kowalevski
再次啟動
[root@206 /]# docker start abc6
[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abc6e11de34e ubuntu:17.10 "/bin/bash" 14 minutes ago Up 2 seconds ecstatic_meitner bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky 2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago amazing_kowalevski
守護態運行
Docker里的容器可以在后台以守護態的方式運行,這樣可以方便我們對Docker的操作
[root@206 /]# docker run -d ubuntu:17.10 /bin/bash -c "while true;do echo thanks;sleep 3;done"
[root@206 /]# docker logs 9e48
thanks thanks thanks thanks thanks thanks thanks thanks ...
終止
假如我們暫時不想運行某個容器,我們可以終止該容器,終止之后,對應的容器將退出運行狀態
[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 2 minutes ago Up 2 minutes inspiring_hawking abc6e11de34e ubuntu:17.10 "/bin/bash" 25 minutes ago Up 11 minutes ecstatic_meitner bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky 2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago amazing_kowalevski
這里有兩個正在后面默默運行的容器
[root@206 /]# docker stop 9e48
9e48 [root@206 /]# docker stop abc6
abc6 [root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 4 minutes ago Exited (137) 13 seconds ago inspiring_hawking abc6e11de34e ubuntu:17.10 "/bin/bash" 28 minutes ago Exited (0) 8 seconds ago ecstatic_meitner bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 3 hours ago Exited (1) 3 hours ago xenodochial_minsky 2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 4 hours ago Exited (1) 4 hours ago amazing_kowalevski
依附容器
我們可以使用Docker attach指令依附到某個容器中,通俗來說,就是指我們可以通過該指令進入某個容器。
沒有在運行的容器是不能依附的
[root@206 /]# docker start abc6
abc6 [root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 10 minutes ago Exited (137) 6 minutes ago inspiring_hawking abc6e11de34e ubuntu:17.10 "/bin/bash" 34 minutes ago Up 2 seconds ecstatic_meitner bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 4 hours ago Exited (1) 4 hours ago xenodochial_minsky 2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 4 hours ago Exited (1) 4 hours ago amazing_kowalevski
[root@206 /]# docker attach abc6
root@abc6e11de34e:/#
其實依附也就是進入一個容器而已
容器信息查看
查看運行中的容器
[root@206 /]# docker ps
查看所有容器
[root@206 /]# docker ps -a
查看最后一次創建的容器
[root@206 /]# docker ps -l
查看運行中的容器的id號
[root@206 /]# docker ps -q
上面的查看守護容器的log
[root@206 /]# docker logs 9e48
實時查看
[root@206 /]# docker logs -f 9e48
只查看最新兩行
[root@206 /]# docker logs --tail=2 9e48
只查看最新的兩行,且不斷實時查看
[root@206 /]# docker logs --tail=2 -f 9e48
附加產生log的具體時間
[root@206 /]# docker logs -t 9e48
容器內命令執行
2.1 后台執行
[root@206 /]# docker exec -d abc6 touch /q.txt
[root@206 /]# docker exec -d abc6 echo "123"
[root@206 /]#
2.2 交互執行
[root@206 /]# docker exec -ti abc6 touch /w.txt
[root@206 /]# docker exec -ti abc6 echo "123"
123
容器的導入導出
我們已經學過如何將某個鏡像導出成一個壓縮文件,移植到其他環境中使用。同樣,我們也可以將某個容器通過docker export指令導出為一個壓縮文件,然后存儲起來,在必要的時候可以根據該壓縮文件恢復為容器
[root@206 /]# docker export abc6 > abc6.tar
[root@206 /]# cat abc6.tar | docker import - cba:v2
查看鏡像,發現多了一個
[root@206 /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE cba v2 7ee75c306951 48 minutes ago 78.5 MB <none> <none> cbf64eb48a64 6 hours ago 89.6 MB newsuse 99999 7e4ff5f67461 6 hours ago 156 MB newubuntu 8888 036d21b62a12 6 hours ago 89.6 MB ubuntu 17.10 073e7b409b9b 43 hours ago 89.6 MB itliucheng/ubuntu first 073e7b409b9b 43 hours ago 89.6 MB
創建容器
[root@206 /]# docker run -ti cba:v2 /bin/bash
雖然容器號不一樣了,但是內容是完全一樣的
數據卷
[root@206 ~]# docker run -ti -v /abctest ubuntu:17.10 /bin/bash
-v就是創建數據卷參數,並且掛載到指定的容器里
root@f109cdc59516:/# ls
abctest bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
掛載
我們在容器中創建了數據卷之后,可以把母機器中的某個目錄或某個文件掛載到數據卷中,這樣,這個目錄或文件與容器中的數據卷內容就相當於是一個了。
[root@206 ~]# cd /
[root@206 /]# mkdir gztest
[root@206 /]# cd gztest/
[root@206 gztest]# touch a.txt
創建容器並掛載 將母機的gztest掛載到 容器中的contest中
[root@206 gztest]# docker run -ti -v /gztest:/contest ubuntu:17.10 /bin/bash
root@9647eb0d2898:/# ls
bin boot contest dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@9647eb0d2898:/# cd contest/
root@9647eb0d2898:/contest# ls
a.txt
延伸:如果創建的容器有權限限制,就修改成這樣創建容器docker run -ti -v /gztest:/contest --privileged=true ubuntu:17.10 /bin/bash 再或者關閉selinux 命令為: setenforce 0
docker run -ti -v /file.txt:/co/b.txt ubuntu:17.10 /bin/bash
數據卷容器
[root@206 /]# docker run -ti -v /abc --name datac1 ubuntu:17.10 /bin/bash
[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b2e8f642c525 ubuntu:17.10 "/bin/bash" 17 seconds ago Exited (0) 8 seconds ago datac1 9647eb0d2898 ubuntu:17.10 "/bin/bash" 27 minutes ago Exited (0) 14 minutes ago focused_jang f109cdc59516 ubuntu:17.10 "/bin/bash" 34 minutes ago Exited (0) 32 minutes ago stupefied_curie 6d8a8372d68b cba:v2 "/bin/bash" 3 hours ago Up 3 hours unruffled_agnesi 9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 6 hours ago Exited (137) 5 hours ago inspiring_hawking abc6e11de34e ubuntu:17.10 "/bin/bash" 6 hours ago Up 5 hours ecstatic_meitner bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 9 hours ago Exited (1) 9 hours ago xenodochial_minsky 2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 9 hours ago Exited (1) 9 hours ago amazing_kowalevski
創建另外一個普通容器,並掛載數據卷容器
[root@206 /]# docker run -ti --volumes-from b2e8 --name testcommon ubuntu:17.10 /bin/bash
root@f99f555cfac5:/# ls
abc bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
數據遷移
[root@206 /]# docker run -ti -v /abcd --name abc ubuntu:17.10 /bin/bash
root@42fae694e443:/# ls
abcd bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@42fae694e443:/# cd abcd/
root@42fae694e443:/abcd# touch a.txt&&touch b.txt
root@42fae694e443:/abcd# ls
a.txt b.txt
創建普通容器
[root@206 /]# docker run -ti --volumes-from 42fa -v /gztest:/backup --name backcontainer ubuntu:17.10 tar cvf /backup/task1.tar /abcd
母機上
[root@206 /]# cd gztest/
[root@206 gztest]# ls
a.txt task1.tar
數據恢復就不說了,在建立一個容器,將母機文件所在目錄掛載到容器的目錄中
容器命名
從之前到現在,創建了很多的容器
[root@206 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c977c2f4e1a9 ubuntu:17.10 "/bin/bash" 24 minutes ago Up 24 minutes 0.0.0.0:32769->8998/tcp net2 e617f1cd394d ubuntu:17.10 "/bin/bash" 25 minutes ago Exited (0) 25 minutes ago net1 dbb53a5ddc3e ubuntu:17.10 "tar cvf /backup/t..." 50 minutes ago Exited (0) 50 minutes ago backcontainer 42fae694e443 ubuntu:17.10 "/bin/bash" 57 minutes ago Exited (0) 56 minutes ago abc f99f555cfac5 ubuntu:17.10 "/bin/bash" 13 hours ago Exited (0) 13 hours ago testcommon b2e8f642c525 ubuntu:17.10 "/bin/bash" 13 hours ago Exited (0) 13 hours ago datac1 9647eb0d2898 ubuntu:17.10 "/bin/bash" 14 hours ago Exited (0) 13 hours ago focused_jang f109cdc59516 ubuntu:17.10 "/bin/bash" 14 hours ago Exited (0) 14 hours ago stupefied_curie 6d8a8372d68b cba:v2 "/bin/bash" 17 hours ago Exited (255) 2 hours ago unruffled_agnesi 9e489b563341 ubuntu:17.10 "/bin/bash -c 'whi..." 19 hours ago Exited (137) 19 hours ago inspiring_hawking abc6e11de34e ubuntu:17.10 "/bin/bash" 20 hours ago Exited (255) 2 hours ago ecstatic_meitner bcd455f0bc0f cbf64eb48a64 "/bin/sh -c 'mkdir..." 23 hours ago Exited (1) 23 hours ago xenodochial_minsky 2f90664d6391 cbf64eb48a64 "/bin/sh -c 'mkdir..." 23 hours ago Exited (1) 23 hours ago amazing_kowalevski
我們先根據容器id查一下容器名稱
[root@206 /]# docker inspect -f "{{.Name}}" 2f90
/amazing_kowalevski
docker不允許容器同名。若出現同名
1、先刪除原容器,再創建新容器。
[root@206 /]# docker rm amazing_kowalevski
把容器名換成id一樣
2、使用--rm標記,一旦容器退出,自動刪除容器
[root@206 /]# docker run -ti --name advc --rm ubuntu:17.10
exit之后容器已經刪除了
網絡服務
1、外部訪問
[root@206 /]# docker run -t -P --expose 8998 --name net2 ubuntu:17.10
-P表示可以外部訪問
--expose綁定端口
[root@206 /]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c977c2f4e1a9 ubuntu:17.10 "/bin/bash" 12 seconds ago Up 11 seconds 0.0.0.0:32769->8998/tcp net2
所以我們可以瀏覽器192.168.126.206:32769來訪問該服務,由於容器里並沒有什么web項目,所以訪問也沒效果
[root@206 /]# docker port net2 8998
0.0.0.0:32769
還可以這樣 小寫的p
[root@206 /]# docker run -t -p 192.168.126.205:8999:5001 --name net3 ubuntu:17.10
他表示訪問192.168.126.206:8999來訪問容器的5001端口
2、容器互聯
容器互聯的方式會在接收容器與源容器間創建一個隧道,接收容器可以看到源容器的指定信息
創建源容器
[root@206 /]# docker run -ti --name hl1 ubuntu:17.10
[root@206 /]# docker start hl1
創建接收容器
[root@206 /]# docker run -ti --name hl2 --link hl1:yuan1 ubuntu:17.10
我們可以進入連接容器,也就是接收容器,然后找到/etc/hosts文件,並cat查看,即可以把該容器的連接信息公開出來,包括該連接容器對應的源容器信息等。公開之后,我們可以使用ping命令測試連接是否通暢。
root@7a9dee156249:/# cat /etc/hosts
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.3 yuan1 30bd2045b737 hl1 172.17.0.4 7a9dee156249
執行 ping 172.17.0.3 或者 ping hl1 即可
2、環境變量法
[root@206 /]# docker run -ti --name hl3 --link hl1:yuan2 ubuntu:17.10 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=7a91ce8a9480 TERM=xterm YUAN2_NAME=/hl3/yuan2 HOME=/root
Dockerfile的使用
這是以前學的只用Dockerfile創建鏡像
[root@206 test]# touch Dockerfile
FROM newubuntu:8888 MAINTAINER root RUN touch a.txt RUN mkdir test1
CMD:執行docker run時執行某行指令,具有替換性
FROM ubuntu:17.10 MAINTAINER root CMD ["echo"] [root@206 test]# docker build -t="copyubuntu" /test
[root@206 /]# docker run -ti copyubuntu echo hello
hello
ENTRYPOINT:執行docker run時執行某行指令,不具有替換性
[root@206 test]# vi Dockerfile
FROM ubuntu:17.10 MAINTAINER root ENTRYPOINT ["echo"]
[root@206 /]# docker build -t="copyubuntu1" /test
[root@206 /]# docker run -ti copyubuntu1 echo hello
echo hello