其實這篇文章在一年多前就起好名字了,由於以前本身對 Docker 的鏡像,容器等概念比較混淆,因此一直都沒有寫。因爲最近從新看了 Docker 的內容,也將 Docker 應用到本身寫的 Python 項目 github.com/AD-feiben/q… 中,將該 Python 項目製做成一個 Docker 鏡像,在使用起來很是方便,因此用這篇文章記錄一下 Docker 的一些知識點,同時分享給你們。關於如何製做鏡像也會在之後的文章中講到。php
對於什麼是 Docker、Docker 的歷史、Docker 經過什麼技術實現、以及爲何要使用 Docker。這裏就不在搬運了網上的文章了,直接上手學習 Docker。前端
若是對上面的內容有興趣,能夠訪問 yeasy.gitbooks.io/docker_prac… 進行學習linux
由於個人是 Mac,這裏只講 Mac 的安裝,其餘系統的安裝能夠參考 yeasy.gitbooks.io/docker_prac…nginx
$ brew cask install docker
複製代碼
使用 brew cask
安裝便可git
首先在 Docker 官網 www.docker.com 註冊一個帳號,登陸帳號github
進入 hub.docker.com/?overlay=on… 下載安裝便可web
下載完成以後雙加 .dmg 文件,將應用拖到 Application 文件夾中便可。安裝完成後,在狀態欄就能夠看到 Docker 的 logo,說明安裝成功。能夠經過 docker --version
命令查看 Docker 的版本。docker
$ docker --version
Docker version 19.03.2, build 6a30dfc
複製代碼
鏡像存放在鏡像倉庫中,Docker 官方也提供了鏡像倉庫 hub.docker.com/ ,咱們能夠從這裏下載咱們所須要的鏡像,固然也能夠將咱們製做好的鏡像存放到倉庫中。當咱們下載好鏡像以後,咱們能夠經過 run
命令來建立對應的容器,一個鏡像能夠建立多個容器,每一個容器,相互之間不會產生影響。shell
如下鏡像的操做均以 Nginx 鏡像爲例centos
$ docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 12022 [OK]
jwilder/nginx-proxy Automated Nginx reverse proxy for docker con… 1669 [OK]
richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable of… 742 [OK]
linuxserver/nginx An Nginx container, brought to you by LinuxS… 77
bitnami/nginx Bitnami nginx Docker Image 71 [OK]
tiangolo/nginx-rtmp Docker image with Nginx using the nginx-rtmp… 55 [OK]
nginxdemos/hello NGINX webserver that serves a simple page co… 28 [OK]
jlesage/nginx-proxy-manager Docker container for Nginx Proxy Manager 24 [OK]
jc21/nginx-proxy-manager Docker container for managing Nginx proxy ho… 23
nginx/nginx-ingress NGINX Ingress Controller for Kubernetes 22
複製代碼
能夠看到 鏡像名 鏡像描述 點贊數 是否爲官方鏡像 是否爲自動生成
利用 docker pull 鏡像名[:版本]
下載咱們須要的鏡像,不輸入版本號默認爲 latest
$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
b8f262c62ec6: Pull complete
e9218e8f93b1: Pull complete
7acba7289aa3: Pull complete
Digest: sha256:aeded0f2a861747f43a01cf1018cf9efe2bdd02afd57d2b11fcc7fcadc16ccd1
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
複製代碼
可使用 docker image ls
或者 docker images
來列出本地存在的鏡像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f949e7d76d63 8 days ago 126MB
centos latest 67fa590cfc1c 6 weeks ago 202MB
複製代碼
其中 REPOSITORY
爲鏡像名;TAG
爲鏡像標籤;IMAGE ID
爲鏡像id;CREATED
爲鏡像建立時間;SIZE
爲鏡像大小,該大小爲解壓縮後的大小,通常比倉庫中的現實的鏡像大小(壓縮後的大小,便於傳輸)要大一些。
經過 docker image rm 鏡像名/鏡像id
或者 docker rmi 鏡像名/鏡像id
來刪除指定的鏡像
$ docker rmi nginx
Error response from daemon: conflict: unable to remove repository reference "nginx" (must force) - container b36481b353d3 is using its referenced image f949e7d76d63
複製代碼
在 Docker 倉庫中還有不少優秀的鏡像,例如 Ubuntu、CentOS、MySQL 等,你們能夠自行查找。
咱們可使用 docker run [選項] 鏡像
來建立一個容器,若是鏡像在本地不存在,則會先到鏡像倉庫下載該鏡像。下面的例子是 nginx 鏡像不存在的狀況。
$ docker run -p 8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
b8f262c62ec6: Pull complete
e9218e8f93b1: Pull complete
7acba7289aa3: Pull complete
Digest: sha256:aeded0f2a861747f43a01cf1018cf9efe2bdd02afd57d2b11fcc7fcadc16ccd1
Status: Downloaded newer image for nginx:latest
# 終端處於監聽容器日誌的狀態
複製代碼
-p
參數將容器中的 80
端口映射到宿主機中的 8080
端口在瀏覽器打開 localhost:8080
就能夠看到熟悉的 nginx 歡迎頁面了。退出容器可使用 Ctrl + C
咱們可使用 docker ps
或者 docker container ls
查看運行中的容器。
上一步驟經過
Ctrl + C
中止了容器
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
複製代碼
能夠看到並無運行中的容器,咱們能夠加上 -a
顯示全部容器,包括中止狀態的容器
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a2d6842faeb5 nginx "nginx -g 'daemon of…" 2 hours ago Exited (0) 2 minutes ago crazy_northcutt
複製代碼
加上 -a
後咱們就能夠看到已經處於中止狀態的容器。
下一步經過下面命令啓動一個新的容器
$ docker run -dit -p 8080:80 nginx
b36481b353d30976171cf7c706f4ce4890f81ee1a81c7e526799fb12198e7f23
複製代碼
-dit
參數也能夠分開寫爲 -d -i -t
-d
參數表示容器在後臺運行,並不會像上個例子處於監聽容器日誌的狀態
-i
參數表示讓容器的標準輸入保持打開
-t
參數表示讓 Docker 分配一個僞終端
能夠看到此次的結果並不像 docker run -p 8080:80 nginx
那樣,處於監聽日誌的狀態。而是返回一個容器id後,終端又恢復到正常狀態。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b36481b353d3 nginx "nginx -g 'daemon of…" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp recursing_khayyam
a2d6842faeb5 nginx "nginx -g 'daemon of…" 2 hours ago Exited (0) 15 minutes ago crazy_northcutt
複製代碼
經過 docker ps -a
命令能夠看到,docker 存在兩個容器。從這個例子咱們能夠知道,同一個鏡像,若是使用 run
命令建立容器,那麼每一個容器都是不一樣的實例。
若是容器處在後臺運行,咱們能夠經過 docker ps
或者 docker container ls
將運行中的容器實例獲取到,而後經過 docker container stop 容器id/容器名
中止指定容器。
$ docker container stop b36481b353d3
# b36481b353d3 爲第二個容器例子,後臺運行的容器
複製代碼
固然容器也是能夠從新啓動的,不須要每次建立。經過 docker container start 容器id
便可從新啓動
$ docker container start b36481b353d3
複製代碼
start
命令啓動的容器都會在後臺運行。經過 docker exec -it 容器id /bin/bash
命令進入容器內,經過 -it
參數打開容器的交互式終端
docker exec -it b36481b353d3 /bin/bash
root@b36481b353d3:/#
複製代碼
咱們能夠在此修改容器內的東西,修改完後經過 exit
退出容器,經過 exec
命令進入容器,退出後容器仍處於運行的狀態。
經過 docker container rm 容器id
刪除指定容器。用該方法只能刪除一個容器,若是咱們想要刪除多個容器,能夠用空格隔開容器id。若是想刪除的容器很是多,可使用 docker container prune
刪除全部處於中止狀態的容器。
$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
a2d6842faeb5cf039420edd684714134c52ca683aefc53a3934792251310ed1d
Total reclaimed space: 0B
複製代碼
docker ps -a
查看中止狀態的容器因爲篇幅問題,有關倉庫的內容將會放到下一篇文章中。
若是你喜歡個人文章,但願能夠關注一下個人公衆號【前端develop】