1.容器概念
容器(Container)——鏡像運行時的實體
一個鏡像運行起來,就是容器
一個鏡像可以啓動多個容器,容器是相互隔離的,一個服務器上可以啓動多個容器,注意容器端口問題!
鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啓動、停止、刪除、暫停等 。
容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的命名空間。前面講過鏡像使用的是分層存儲,容器也是如此。
容器存儲層的生存週期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存於容器存儲層的信息都會隨容器刪除而丟失。
2.Docker容器操作
2.1.查看容器
語法:
docker ps [OPTIONS]
OPTIONS說明(常用):
-a :列出當前所有正在運行的容器+歷史上運行過的
-l :顯示最近創建的容器。
-n:顯示最近n個創建的容器。
-q :靜默模式,只顯示容器編號。
–no-trunc :不截斷輸出
- 查看正在運行容器:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 查看所有的容器(啓動過的歷史容器):
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b3e9c904970 mysql "docker-entrypoint..." 3 months ago Exited (255) 4 hours ago 0.0.0.0:3306->3306/tcp, 33060/tcp my1024_mysql
- 查看最後一次運行的容器
[root@localhost ~]# docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b3e9c904970 mysql "docker-entrypoint..." 3 months ago Exited (255) 4 hours ago 0.0.0.0:3306->3306/tcp, 33060/tcp my1024_mysql
- 查看停止的容器
[root@localhost ~]# docker ps -f status=exited
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b3e9c904970 mysql "docker-entrypoint..." 3 months ago Exited (255) 4 hours ago 0.0.0.0:3306->3306/tcp, 33060/tcp my1024_mysql
2.2.創建與啓動容器(重點)
容器是通過鏡像啓動而來的!
語法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
創建容器常用的參數說明:
-i:表示運行容器
-t:表示容器啓動後會進入其命令行。加入這兩個參數後,容器創建就能登錄進去。即分配一個僞終端。
--
name :爲創建的容器命名。
-v:表示目錄映射關係(前者是宿主機目錄,後者是映射到宿主機上的目錄),可以使用多個-v做多個目錄或文件映射。注意:最好做目錄映射,在宿主機上做修改,然後共享到容器上。
-d:在run後面加上-d參數,則會創建一個守護式容器在後臺運行(這樣創建容器後不會自動登錄容器,如果只加-i -t兩個參數,創建後就會自動進去容器)。
-p:表示端口映射,前者是宿主機端口,後者是容器內的映射端口。可以使用多個-p做多個端口映射
2.2.1.交互式容器(啓動並登錄進去)
使用鏡像centos:latest以交互模式啓動一個容器,在容器內執行/bin/bash命令,並取名爲mycentos
docker run -it --name=mycentos centos:7 /bin/bash
[root@localhost ~]# docker run -it --name=mycentos centos:7 /bin/bash
Unable to find image 'centos:7' locally
Trying to pull repository docker.io/library/centos ...
7: Pulling from docker.io/library/centos
8ba884070f61: Pull complete
Digest: sha256:a799dd8a2ded4a83484bbae769d97655392b3f86533ceb7dd96bbac929809f3c
Status: Downloaded newer image for docker.io/centos:7
這時我們通過ps命令查看,發現可以看到啓動的容器,狀態爲啓動狀態
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68af7641543c centos:7 "/bin/bash" 2 minutes ago Up 2 minutes mycentos
使用exit命令 退出當前容器
[root@68af7641543c /]# exit
exit
[root@localhost ~]#
然後用ps -a 命令查看發現該容器也隨之停止:
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
68af7641543c centos:7 "/bin/bash" 3 minutes ago Exited (0) 28 seconds ago mycentos
8b3e9c904970 mysql "docker-entrypoint..." 3 months ago Exited (255) 4 hours ago 0.0.0.0:3306->3306/tcp, 33060/tcp my1024_mysql
2.2.2.守護式容器(先創建容器,然後登錄進去)
創建一個守護式容器:如果對於一個需要長期運行的容器來說,我們可以創建一個守護式容器。命令如下(容器名稱不能重複):
docker run -di --name=mycentos2 centos:7
[root@localhost ~]# docker run -di --name=mycentos2 centos:7
bf9248203458805ff33b997c50b89b58791ac1af21b22e2ab243a8bee2a0bf66
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf9248203458 centos:7 "/bin/bash" 19 seconds ago Up 18 seconds mycentos2
登錄守護式容器方式:
docker exec -it container_name (或者 container_id) /bin/bash(exit退出時,容器不會停止)
[root@localhost ~]# docker exec -it mycentos2 /bin/bash
[root@bf9248203458 /]# ll
total 12
-rw-r--r--. 1 root root 12082 Mar 5 17:36 anaconda-post.log
lrwxrwxrwx. 1 root root 7 Mar 5 17:34 bin -> usr/bin
drwxr-xr-x. 5 root root 340 Jun 17 11:30 dev
drwxr-xr-x. 1 root root 66 Jun 17 11:30 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 home
lrwxrwxrwx. 1 root root 7 Mar 5 17:34 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Mar 5 17:34 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
drwxr-xr-x. 2 root root 6 Apr 11 2018 opt
dr-xr-xr-x. 125 root root 0 Jun 17 11:30 proc
dr-xr-x---. 2 root root 114 Mar 5 17:36 root
drwxr-xr-x. 1 root root 21 Jun 17 11:30 run
lrwxrwxrwx. 1 root root 8 Mar 5 17:34 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
dr-xr-xr-x. 13 root root 0 Jun 10 16:40 sys
drwxrwxrwt. 7 root root 132 Mar 5 17:36 tmp
drwxr-xr-x. 13 root root 155 Mar 5 17:34 usr
drwxr-xr-x. 18 root root 238 Mar 5 17:34 var
[root@bf9248203458 /]#
2.2.3.停止與啓動容器
- 停止正在運行的容器:
docker stop $CONTAINER_NAME/ID
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf9248203458 centos:7 "/bin/bash" 4 minutes ago Up 4 minutes mycentos2
[root@localhost ~]# docker stop mycentos2
mycentos2
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 啓動已運行過的容器:
docker start $CONTAINER_NAME/ID
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker start mycentos2
mycentos2
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bf9248203458 centos:7 "/bin/bash" 5 minutes ago Up 3 seconds mycentos2
2.2.4.重啓容器
docker restart 容器ID或者容器名
2.2.5.強制停止容器
docker kill 容器ID或者容器名
2.2.6.文件拷貝(重點)
如果我們需要將文件拷貝到容器內可以使用cp命令
docker cp 需要拷貝的文件或目錄 容器名稱:容器目錄
[root@localhost ~]# touch 1.txt
[root@localhost ~]# docker cp 1.txt mycentos2:/root/
[root@localhost ~]# docker exec -it mycentos2 /bin/bash
[root@bf9248203458 /]# cd /root/
[root@bf9248203458 ~]# ll
total 4
-rw-r--r--. 1 root root 0 Jun 17 11:42 1.txt
-rw-------. 1 root root 3415 Mar 5 17:36 anaconda-ks.cfg
也可以將文件從容器內拷貝出來
docker cp 容器名稱:容器目錄 需要拷貝的文件或目錄
[root@localhost ~]# docker cp mycentos2:/root/111.txt /root/
[root@localhost ~]# cd /root/
[root@localhost ~]# ll
總用量 4
-rw-r--r--. 1 root root 0 6月 17 19:42 111.txt
-rw-r--r--. 1 root root 0 6月 17 19:42 1.txt
-rw-------. 1 root root 1257 2月 17 21:33 anaconda-ks.cfg
2.2.7.目錄掛載(重點)
我們可以在創建容器的時候,將宿主機的目錄與容器內的目錄進行映射,這樣我們就可以通過修改宿主機某個目錄的文件從而去影響容器。
創建容器 添加-v參數 後邊爲 宿主機目錄:容器目錄
docker run -di --name=mycentos2 -v /usr/local/myhtml:/usr/local/myhtml centos:7
[root@localhost myhtml]# docker run -di --name=mycentos3 -v /usr/local/myhtml:/usr/local/myhtml centos:7
d6e67c10f59d2169ba73436d51253a6280aac1ca47ed5223c4591a90b8e2a31e
[root@localhost myhtml]# docker exec -it mycentos3 /bin/bash
[root@d6e67c10f59d /]# cd /usr/local/
[root@d6e67c10f59d local]# ll
total 0
drwxr-xr-x. 2 root root 6 Apr 11 2018 bin
drwxr-xr-x. 2 root root 6 Apr 11 2018 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 games
drwxr-xr-x. 2 root root 6 Apr 11 2018 include
drwxr-xr-x. 2 root root 6 Apr 11 2018 lib
drwxr-xr-x. 2 root root 6 Apr 11 2018 lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 libexec
drwxr-xr-x. 2 root root 6 Jun 17 11:48 myhtml
drwxr-xr-x. 2 root root 6 Apr 11 2018 sbin
drwxr-xr-x. 5 root root 49 Mar 5 17:34 share
drwxr-xr-x. 2 root root 6 Apr 11 2018 src
如果你共享的是多級的目錄,可能會出現權限不足的提示。
這是因爲CentOS7中的安全模塊selinux把權限禁掉了,我們需要添加參數 --privileged=true 來解決掛載的目錄沒有權限的問題
docker run -di --name=mycentos3 -v /usr/local/myhtml:/usr/local/myhtml --privileged=true centos:7
2.2.8.查看容器IP地址
我們可以通過以下命令查看容器運行的各種數據
[root@localhost myhtml]# docker inspect mycentos3
也可以直接執行下面的命令直接輸出IP地址
[root@localhost myhtml]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos3
172.17.0.2
測試宿主機連接容器
[root@localhost myhtml]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.100 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.040 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.082 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.040 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.061 ms
64 bytes from 172.17.0.2: icmp_seq=6 ttl=64 time=0.039 ms
64 bytes from 172.17.0.2: icmp_seq=7 ttl=64 time=0.040 ms
^C
--- 172.17.0.2 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6004ms
rtt min/avg/max/mdev = 0.039/0.057/0.100/0.023 ms
2.2.9.刪除容器
- 刪除指定的容器:
docker rm $CONTAINER_ID/NAME
注意,只能刪除停止的容器
-
刪除所有容器:
docker rm `docker ps -a -q`