20分鐘時間,大家可以快速掌握Docker相關知識,首先得了解幾個概念。其實Docker和我們之前接觸的Virtual Box、VMWare、QEMU類似,只是Docker是簡單的進程級隔離管理方法。其中包括容器及鏡像兩個常用的概念,可以認爲docker就是一個管理平臺,container就是一個虛擬機,鏡像是一個當前虛擬機的快照,container裏面可以跑操作系統。多個容器裏面可以用同一個鏡像生成。這麼類比的話,大家可能更容易理解一點。下面簡單基於Mac上的docker簡單介紹一下相關的命令,其他系統命令都一樣。
1. 先在mac上安裝docker,用命令行安裝即可,很簡單:
brew cask install docker
會提示你輸入密碼,如果你之前安裝過要重新安裝,可以用:
brew cask reinstall docker
安裝好之後會在你Mac的啓動臺有個圖標,點擊啓動之後才能命令行裏使用docker相關命令,不然命令行提示找不到。或者啓動服務:
systemctl start docker.service
2. 拉取Centos鏡像
這裏我們拉centos7.5.1804作爲例子,你可以修改冒號後的版本號拉去你想要的版本
docker pull <System Name>:<Version Number>
這裏要注意一下,拉去鏡像的時候可能拉不到,這是因爲被強了,你得搞個外網的proxy。
拉取的信息輸出:
(base) ➜ ~ docker pull centos:7.5.1804
7.5.1804: Pulling from library/centos
5ad559c5ae16: Pull complete
Digest: sha256:7a45e4a1efbaafc1d9aa89925b6fdb33288a96d35ea0581412316e2f0ad3720a
Status: Downloaded newer image for centos:7.5.1804
docker.io/library/centos:7.5.1804
3. 查看拉取得鏡像
docker images
輸出結果如下,記着我們的IMAGE ID
(base) ➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7.5.1804 cf49811e3cdb 6 months ago 200MB
4. 加載鏡像到docker
docker run -it <Image ID> /bin/bash
cf498是IMAGE ID的前5位,這裏只需要輸入能區分其他IMAGE的前幾位就可以了。不需要全部輸入。
之後你就登陸到docker上了,這個時候,會同時創建一個docker容器,就是Container。
讓我來查看下centos上的版本信息是否和我們拉取的一致吧。
登錄信息如下,root後面@的部分就是你的Container ID(容器ID)
(base) ➜ ~ docker run -it cf498 /bin/bash
[root@58ed746e59f8 /]#
5. 查看版本信息
查看版本信息如下:
[root@58ed746e59f8 /]# cat /proc/version
Linux version 4.9.184-linuxkit (root@a8c33e955a82) (gcc version 8.3.0 (Alpine 8.3.0) ) #1 SMP Tue Jul 2 22:58:16 UTC 2019
[root@58ed746e59f8 /]# uname -a
Linux 58ed746e59f8 4.9.184-linuxkit #1 SMP Tue Jul 2 22:58:16 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@58ed746e59f8 /]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
6. 退出容器
可以用Ctrl+d或者在docker命令行輸入exit,即可退出容器,但是對於attach登上來的,可能會停止容器。如果想退出時,容器依然在,可以用Ctrl+p+q。
7. 查看當前容器的狀態
docker ps -a
(base) ➜ ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58ed746e59f8 cf498 "/bin/bash" 12 minutes ago Exited (0) About a minute ago clever_kepler
這裏容器status 已經變成退出了。
8. 再次進入容器
建議用exec,不要用attach,用attach進入的話,退出用Ctrl+D或者exit命令會終止容器,但是用exec登錄就不會停止容器。
docker exec -it <Container ID> /bin/bash
docker attach <Container ID>
當容器退出的時候,你再次用exec或者attach進入容器就會報錯。
base) ➜ ~ docker exec -it 58ed746e59f8 /bin/bash
Error response from daemon: Container 58ed746e59f890c3f0c431e5cc253e1af3aa58bf6d88e9ebe345177d2723b0e0 is not running
(base) ➜ ~ docker attach 58ed746e59f8
You cannot attach to a stopped container, start it first
這個時候有兩種方,第一種方法,採用第四步的加載鏡像,但是這個時候會重新創建一個容器,這並不是我們想要的
(base) ➜ ~ docker run -it cf498 /bin/bash
[root@3336e7dba13c /]# exit
(base) ➜ ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3336e7dba13c cf498 "/bin/bash" 52 seconds ago Exited (0) 6 seconds ago flamboyant_lewin
58ed746e59f8 cf498 "/bin/bash" 20 minutes ago Exited (0) 9 minutes ago clever_kepler
第二種方法start之前的container,然後再exec上去。
9. 重啓container
docker start <Container ID>
(base) ➜ ~ docker start 3336e7dba13c
3336e7dba13c
(base) ➜ ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3336e7dba13c cf498 "/bin/bash" 4 minutes ago Up 4 seconds flamboyant_lewin
58ed746e59f8 cf498 "/bin/bash" 24 minutes ago Exited (0) 13 minutes ago clever_kepler
再用docker exec就可以登錄激活狀態的container了。
(base) ➜ ~ docker exec -it 3336e7dba13c /bin/bash
[root@3336e7dba13c /]# exit
(base) ➜ ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3336e7dba13c cf498 "/bin/bash" 6 minutes ago Up 2 minutes flamboyant_lewin
58ed746e59f8 cf498 "/bin/bash" 26 minutes ago Exited (0) 15 minutes ago clever_kepler
再次從container裏面退出,之前的docker也一直處於活躍狀態。那這個時候想停掉活躍的container,怎麼辦呢?可以用stop命令。
10. 停止container
docker stop <Container ID>
停止鏡像需要一會時間,大家耐心等一下。結果如下:
(base) ➜ ~ docker stop 3336e7dba13c
3336e7dba13c
(base) ➜ ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3336e7dba13c cf498 "/bin/bash" 9 minutes ago Exited (137) 48 seconds ago flamboyant_lewin
58ed746e59f8 cf498 "/bin/bash" 29 minutes ago Exited (0) 19 minutes ago
11. 保存容器內容爲鏡像
docker commit <Container ID>
我們先啓動3336e7dba13c這個容器,然後做一個鏡像
(base) ➜ ~ docker commit 3336e7dba13c
sha256:3b7a68bf880b0a7ca2c2459a37ff5562efbb2540ea7939d446a32a5acdef937e
(base) ➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 3b7a68bf880b 6 seconds ago 200MB
centos 7.5.1804 cf49811e3cdb 6 months ago 200MB
我們發現新的IMAGE被打好了,但是REPOSITORY和TAG是none,這讓我們後面很難區分,這個時候,可以用tag來標記docker鏡像。
docker tag <Image ID> <New Tag Name>
其中ID就是對應的IMAGEID, 後面centos1是對應的REPOSITORY的名字。
(base) ➜ ~ docker tag 3b7a68bf880b centos1
(base) ➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos1 latest 3b7a68bf880b About a minute ago 200MB
centos 7.5.1804 cf49811e3cdb 6 months ago 200MB
12. 刪除容器
docker rm <Container ID>
這裏要注意不能刪除正在活躍的容器,不然會報錯
(base) ➜ ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3336e7dba13c cf498 "/bin/bash" 19 minutes ago Up 5 minutes flamboyant_lewin
58ed746e59f8 cf498 "/bin/bash" 39 minutes ago Exited (0) 28 minutes ago clever_kepler
(base) ➜ ~ docker rm 3336e7dba13c
Error response from daemon: You cannot remove a running container 3336e7dba13c58df693233bcea09a05b28d311dc6e3fbd8f66eed1e894aae9e2. Stop the container before attempting removal or force remove
我們可以嘗試刪除之前那個停掉的容器58ed746e59f8,或者用stop容器3336e7dba13c停掉之後再刪除。
(base) ➜ ~ docker rm 58ed746e59f8
58ed746e59f8
(base) ➜ ~ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3336e7dba13c cf498 "/bin/bash" 23 minutes ago Up 9 minutes flamboyant_lewin
發現刪完了之後,就剩下那個活躍的容器了
13 刪除鏡像
docker rmi <Image ID>
我們嘗試刪除剛上面生成的鏡像:3b7a68bf880b
(base) ➜ ~ docker rmi 3b7a68bf880b
Untagged: centos1:latest
Deleted: sha256:3b7a68bf880b0a7ca2c2459a37ff5562efbb2540ea7939d446a32a5acdef937e
(base) ➜ ~ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7.5.1804 cf49811e3cdb 6 months ago 200MB
到此docker基本命令已經講完了,是不是覺得很簡單。