初識 Docker

ag-0-1dm65t1f6

其實這篇文章在一年多前就起好名字了,由於以前本身對 Docker 的鏡像,容器等概念比較混淆,因此一直都沒有寫。因爲最近從新看了 Docker 的內容,也將 Docker 應用到本身寫的 Python 項目 github.com/AD-feiben/q… 中,將該 Python 項目製做成一個 Docker 鏡像,在使用起來很是方便,因此用這篇文章記錄一下 Docker 的一些知識點,同時分享給你們。關於如何製做鏡像也會在之後的文章中講到。php

對於什麼是 Docker、Docker 的歷史、Docker 經過什麼技術實現、以及爲何要使用 Docker。這裏就不在搬運了網上的文章了,直接上手學習 Docker。前端

若是對上面的內容有興趣,能夠訪問 yeasy.gitbooks.io/docker_prac… 進行學習linux

1、安裝

由於個人是 Mac,這裏只講 Mac 的安裝,其餘系統的安裝能夠參考 yeasy.gitbooks.io/docker_prac…nginx

1.1 使用 Homebrew 安裝

$ brew cask install docker
複製代碼

使用 brew cask 安裝便可git

1.2 手動下載安裝

  1. 首先在 Docker 官網 www.docker.com 註冊一個帳號,登陸帳號github

  2. 進入 hub.docker.com/?overlay=on… 下載安裝便可web

下載

下載完成以後雙加 .dmg 文件,將應用拖到 Application 文件夾中便可。安裝完成後,在狀態欄就能夠看到 Docker 的 logo,說明安裝成功。能夠經過 docker --version 命令查看 Docker 的版本。docker

$ docker --version
Docker version 19.03.2, build 6a30dfc
複製代碼

2、Docker 的一些概念

https://user-gold-cdn.xitu.io/2019/10/7/16da661eef3572d0?w=1067&h=811&f=png&s=90020

鏡像存放在鏡像倉庫中,Docker 官方也提供了鏡像倉庫 hub.docker.com/ ,咱們能夠從這裏下載咱們所須要的鏡像,固然也能夠將咱們製做好的鏡像存放到倉庫中。當咱們下載好鏡像以後,咱們能夠經過 run 命令來建立對應的容器,一個鏡像能夠建立多個容器,每一個容器,相互之間不會產生影響。shell

2.1 image 鏡像

如下鏡像的操做均以 Nginx 鏡像爲例centos

2.1.1 搜索鏡像

$ 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
複製代碼

能夠看到 鏡像名 鏡像描述 點贊數 是否爲官方鏡像 是否爲自動生成

2.1.2 下載鏡像

利用 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
複製代碼

2.1.3 列出本地鏡像

可使用 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 爲鏡像大小,該大小爲解壓縮後的大小,通常比倉庫中的現實的鏡像大小(壓縮後的大小,便於傳輸)要大一些。

2.1.4 刪除鏡像

經過 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 等,你們能夠自行查找。

2.2 container 容器

2.2.1建立容器

咱們可使用 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

https://user-gold-cdn.xitu.io/2019/10/7/16da661f11ea5720?w=1200&h=520&f=jpeg&s=83078

2.2.2 查看運行中的容器

咱們可使用 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 命令建立容器,那麼每一個容器都是不一樣的實例。

2.2.3 中止容器

若是容器處在後臺運行,咱們能夠經過 docker ps 或者 docker container ls 將運行中的容器實例獲取到,而後經過 docker container stop 容器id/容器名 中止指定容器。

$ docker container stop b36481b353d3
# b36481b353d3 爲第二個容器例子,後臺運行的容器
複製代碼

2.2.4 啓動容器

固然容器也是能夠從新啓動的,不須要每次建立。經過 docker container start 容器id 便可從新啓動

$ docker container start b36481b353d3
複製代碼
  • 經過 start 命令啓動的容器都會在後臺運行。

2.2.5 進入容器內

經過 docker exec -it 容器id /bin/bash 命令進入容器內,經過 -it 參數打開容器的交互式終端

docker exec -it b36481b353d3 /bin/bash
root@b36481b353d3:/#
複製代碼

咱們能夠在此修改容器內的東西,修改完後經過 exit 退出容器,經過 exec 命令進入容器,退出後容器仍處於運行的狀態。

2.2.6 刪除容器

經過 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 查看中止狀態的容器

2.3 repository 倉庫

因爲篇幅問題,有關倉庫的內容將會放到下一篇文章中。


若是你喜歡個人文章,但願能夠關注一下個人公衆號【前端develop】

前端develop
相關文章
相關標籤/搜索