<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                # 1.2 Docker 容器和鏡像的基本操作 首先,用一張圖來概括 Docker 容器和鏡像的一些常用命令。 ![Docker 命令](https://box.kancloud.cn/5f6d7f9fec3705567af54613a84a71ac_812x643.png) 我們根據這幅圖來介紹一下 Docker 的一些基本概念: - 鏡像(Images):Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如環境變量、用戶等)。 - 容器(Container):鏡像和容器的關系,就像是面對對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。 - 倉庫(Docker Registry):集中存儲、分發鏡像的服務。比如說 Docker Hub。 接下來我們來根據這個圖來說明一些 Docker 鏡像和容器的一些基本操作方法。 ## 獲取鏡像 Docker 官方提供了一個公共的鏡像倉庫:[Docker Hub](https://hub.docker.com/search/?type=image),我們可以從這上面獲取鏡像。 獲取鏡像的命令為: ```bash Usage: docker image pull [OPTIONS] [Docker Registry[:Port]/]Name[:TAG] ``` - Docker 鏡像倉庫地址:地址的格式一般是<域名/IP>[:端口],如果不填寫默認為 Docker Hub。 - 倉庫名:倉庫名是兩段式名稱,即<用戶名>/<軟件名>。對于 Docker Hub,如果不填寫用戶名,則默認為 Library,也就是官方鏡像。 - 標簽:對于同一個倉庫名,可能會存在多個標簽,即多個版本。如果不填寫標簽,默認為 latest 標簽。 比如,我們下載一個 CentOS 官方鏡像: ```bash $ docker image pull centos Using default tag: latest latest: Pulling from library/centos a02a4930cb5d: Pull complete Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426 Status: Downloaded newer image for centos:latest ``` 上面的命令沒有給出 Docker 鏡像倉庫地址,因此將會從 Docker Hub 獲取鏡像;也沒有給出用戶名,因此會從官方鏡像庫即 Library 獲取 CentOS 鏡像;也沒有給出標簽,因此會獲取 latest 標簽的 CentOS 鏡像。 通常我們會指定標簽獲取指定版本的鏡像: ```bash $ docker image pull ubuntu:16.04 16.04: Pulling from library/ubuntu 7b722c1070cd: Pull complete 5fbf74db61f1: Pull complete ed41cb72e5c9: Pull complete 7ea47a67709e: Pull complete Digest: sha256:e4a134999bea4abb4a27bc437e6118fdddfb172e1b9d683129b74d254af51675 Status: Downloaded newer image for ubuntu:16.04 ``` ## 列出鏡像 獲取完鏡像,我們可以列出我們已經獲取到的本地鏡像。 列出鏡像的命名為: ```bash Usage: docker image ls [OPTIONS] [REPOSITORY[:TAG]] ``` 例如,我們列出所有的鏡像: ```bash $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 16.04 7e87e2b3bf7a 3 weeks ago 117MB centos 7 1e1148e4cc2c 2 months ago 202MB centos latest 1e1148e4cc2c 2 months ago 202MB ``` ## 刪除鏡像 如果本地鏡像倉庫中的鏡像有不需要用到的,我們可以刪除鏡像來釋放出硬盤資源。 刪除鏡像的命令如下: ```bash Usage: docker image rm [OPTIONS] IMAGE [IMAGE...] ``` 比如,我們刪除剛才下載的 centos:7 鏡像: ```bash $ docker image rm centos:7 Untagged: centos:7 Untagged: centos@sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426 Deleted: sha256:1e1148e4cc2c148c6890a18e3b2d2dde41a6745ceb4e5fe94a923d811bf82ddb Deleted: sha256:071d8bd765171080d01682844524be57ac9883e53079b6ac66707e192ea25956 ``` ## 運行容器 有了 Docker 鏡像后,我們就可以以這個鏡像為基礎啟動并運行一個容器。 運行容器的命令為: ```bash Usage: docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] ``` 以上面的 Ubuntu 16.04 鏡像為例,我們來啟動里面的 bash 并且進行交互式操作,可以執行以下命令。 ```bash $ docker container run -it --rm ubuntu:16.04 /bin/bash root@f07761908385:/# cat /etc/os-release NAME="Ubuntu" VERSION="16.04.5 LTS (Xenial Xerus)" ID=ubuntu ID_LIKE=debian PRETTY_NAME="Ubuntu 16.04.5 LTS" VERSION_ID="16.04" HOME_URL="http://www.ubuntu.com/" SUPPORT_URL="http://help.ubuntu.com/" BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/" VERSION_CODENAME=xenial UBUNTU_CODENAME=xenial root@afcf72ed65a5:/# exit exit ``` Run 命令的用法在以后會詳細總結,先簡要說明下上面用到的參數。 - -it:這是兩個參數,一個是 -i,表示以交互模式運行容器;一個是 -t,表示為容器分配一個偽終端。通常這兩個參數結合使用。我們需要進入 bash 執行一些命令并查看返回結果,因此我們需要交互式終端。 - --rm:這個參數表示退出容器時會將容器刪除。默認情況下,為了排障需求,退出容器不會刪除容器,除非手動執行 docker rm 命令。我們這里只是進行簡單的驗證與查看結果,不需要排障和保留結果,因此使用 --rm 參數可以避免浪費空間。 - ubuntu:16.04:這里指定鏡像名稱為 ubuntu:16.04。 - /bin/bash:放在鏡像名后面的命令,我們的目的是有個交互式的 Shell 來執行命令,因此用的是 bash。 進入容器后,我們可以在 Shell 環境下操作,執行命令。這里我們執行了 `cat /etc/os-release`,從返回的結果看到容器內是 Ubuntu 16.04.5 LTS 系統。 最后我們通過 `exit` 退出了容器。 ## 后臺運行容器 通常情況下,我們需要讓 Docker 在后臺運行而不是直接把執行命令的結果輸出在當前宿主機下。此時,可以通過添加 `-d` 參數來實現。 下面,我們舉兩個例子來說明一下: 首先,不使用 `-d` 參數來運行 nginx 容器: ``` $ docker container run -p 80:80 --name nginx nginx:1.14.2 ``` - -p:這里 -p 參數表示將容器內的端口映射至宿主機上。 - --name: 指定容器的容器名稱,如果不指定會隨機分配一個。 此時我們在瀏覽器中輸入宿主機的 ip:port,比如我這里是 http://10.10.113.16/ ,容器就會把輸出的結果(STOUT)打印到宿主機上面: ``` $ docker container run -p 80:80 --name nginx nginx:1.14.2 10.10.22.162 - - [14/Feb/2019:02:27:54 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://10.10.113.16/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36" "-" ``` 并且我們使用 <Ctrl-C> 快捷鍵退出當前的輸出流后,這個容器也會隨之停止。 然后,我們使用 `-d` 參數來運行 nginx 容器: ``` docker container run -d -p 80:80 --name nginx nginx:1.14.2 660e2ee880a74785582dbc4baac96c3a99a6e8300e02dcdc689c1e5d9fe0fe38 ``` 使用 `-d` 參數啟動后會返回一個唯一的容器 id。此時容器就在后臺運行,我們依然可以通過瀏覽器訪問 http://10.10.113.16/ 。 ## 列出容器 我們在后臺運行容器后,可以列出正在運行的容器。 列出容器的命令如下: ```bash Usage: docker container ls [OPTIONS] ``` 比如,我們列出剛才在后臺運行的 Nginx 容器: ``` $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 660e2ee880a7 nginx:1.14.2 "nginx -g 'daemon of…" 7 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp nginx ``` 默認情況下,只會列出正在運行的容器。如果想列出所有的容器,包括已經停止的容器則需要添加 `-a` 參數。 ``` $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 660e2ee880a7 nginx:1.14.2 "nginx -g 'daemon of…" 58 seconds ago Up 57 seconds 0.0.0.0:80->80/tcp nginx d9e0537848da nginx:1.14.2 "nginx -g 'daemon of…" 21 minutes ago Exited (0) 20 minutes ago tender_villani ``` ## 終止、啟動與重啟容器 我們可以使用 `docker container stop` 命令來停止一個正在運行中的容器: ```bash $ docker container stop nginx nginx # 此時可以看到 nginx 容器已經處于停止狀態 docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 660e2ee880a7 nginx:1.14.2 "nginx -g 'daemon of…" 20 minutes ago Exited (0) 11 minutes ago nginx ``` 對于已停止的容器,我們可以使用 `docker container start` 命令來啟動一個處于停止狀態的容器: ```bash $ docker container start nginx nginx ``` 我們還可以用 `docker container restart` 命令來重啟容器: ```bash $ docker container restart nginx nginx ``` ## 查看容器日志 對于后臺運行的容器,我們可以通過 `docker container logs` 命令來查看正在運行容器的日志: ```bash $ docker container logs nginx 10.10.22.162 - - [14/Feb/2019:03:06:39 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36" "-" ``` 并且我們可以通過添加 `-f` 參數實時跟蹤容器的日志: ```bash $ docker container logs -f nginx 10.10.22.162 - - [14/Feb/2019:03:06:39 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36" "-" 10.10.22.162 - - [14/Feb/2019:03:06:40 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36" "-" ``` 這對于排查故障很有幫助。 ## 進入容器 有多種進入容器的方式,這里我們只介紹 2 中方式: 1. 第一種,使用 `docker container attach` 進入容器。 這種方式表示將本地標準輸入、輸出、錯誤附加到正在運行的容器中。 ```bash $ docker container attach nginx ``` 這時,如果容器啟動時執行的命令不是 bash 或者其他的 Shell 環境的話,是無法執行命令的,可以理解為把后臺啟動容器以前臺的方式呈現。 這種方式進入容器后,使用 <Ctrl-C> 快捷鍵退出輸出流時,容器也會停止: ```bash $ docker container attach nginx ^C $ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 660e2ee880a7 nginx:1.14.2 "nginx -g 'daemon of…" 35 minutes ago Exited (0) 41 seconds ago nginx ``` 因此不推薦使用這種方式來進入容器。 2. 第二種,使用 `docker container exec` 在容器內執行命令來啟動一個交互式的終端進入容器。 這種方式,相當于在容器內運行一個 bash 環境令并且添加參數 `-it` 來啟動一個交互式的終端。 ```bash $ docker container exec -ti nginx /bin/bash root@1425410889aa:/# ``` 這樣我們就可以在容器內執行命令了。比如我們修改主頁的代碼: ```bash $ docker container exec -ti nginx /bin/bash root@1425410889aa:/# cd /usr/share/nginx/html/ root@1425410889aa:/usr/share/nginx/html# echo test > index.html root@1425410889aa:/usr/share/nginx/html# exit exit ``` 此時執行 `exit` 退出容器后容器也不會停止,我們訪問 nginx 會發現主頁已經被修改: ```bash $ curl http://10.10.113.16 test ``` 這也是為什么推薦使用 `docker container exec` 的原因。 ## 刪除容器 我們可以使用 `docker container rm` 來刪除一個已經處于停止狀態下的容器: ```bash $ docker container stop nginx nginx $ docker container rm nginx nginx ``` 也可以添加 `-f` 參數來刪除一個正在運行中的容器: ```bash $ docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b9f3e39cc713 nginx:1.14.2 "nginx -g 'daemon of…" 33 seconds ago Up 33 seconds 0.0.0.0:80->80/tcp nginx $ docker container rm -f nginx nginx ``` ## 根據容器的更改定制鏡像 鏡像是容器的基礎,每次執行 `docker container run` 時都會指定一個鏡像作為容器運行的基礎。 在之前的例子中,我們都是使用來自 Docker Hub 的官方鏡像。直接使用這些鏡像是可以滿足一定的需求。但有時候無法直接滿足需求時,我們就需要定制這些鏡像。 我們依然運行一個 nginx 容器: ```bash $ docker container run -d -p 80:80 --name nginx nginx:1.14.2 ``` 然后進入 nginx 容器修改主頁: ```bash $ docker container exec -ti nginx /bin/bash root@b1d959eea100:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html ``` 現在刷新瀏覽器的話,會發現主頁的內容發生變化: ```bash curl http://10.10.113.16 <h1>Hello, Docker!</h1> ``` 我們修改了容器的文件,也就是改動了容器的存儲層。我們可以通過 `docker container diff` 命令看到具體的改動: ```bash $ docker container diff nginx C /usr C /usr/share C /usr/share/nginx C /usr/share/nginx/html C /usr/share/nginx/html/index.html C /root A /root/.bash_history C /var C /var/cache C /var/cache/nginx A /var/cache/nginx/client_temp A /var/cache/nginx/fastcgi_temp A /var/cache/nginx/proxy_temp A /var/cache/nginx/scgi_temp A /var/cache/nginx/uwsgi_temp C /run A /run/nginx.pid ``` - A:文件或目錄被添加 - D:文件或目錄被刪除 - C:文件或目錄被修改 現在我們定制好了容器的更改內容,接下來希望能將這個容器保存下來變成鏡像以后可以直接使用。 當我們運行一個容器的時候(如果不使用共享數據卷),我們做任何文件的修改都會被記錄于容器存儲層,而 Docker 提供了一個 `docker container commit` 命令可以將容器的存儲層保存下來成為鏡像。即在原有的鏡像基礎上,再疊加上容器的存儲層,并構成新的鏡像。 ```bash $ docker commit --author "Peng.Gao" --message "修改默認首頁" nginx jugggao/nginx:1.0 sha256:62f1198899f38b566c0057b9448ae46666e73c013ad878c3de3ba56fed34ddf3 ``` 我們還可以使用 `docker image history` 來查看鏡像內的歷史記錄: ```bash $ docker image history jugggao/nginx:1.0 IMAGE CREATED CREATED BY SIZE COMMENT 62f1198899f3 About a minute ago nginx -g daemon off; 92B 修改默認首頁 1293e2b0a1af 7 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B <missing> 7 days ago /bin/sh -c #(nop) STOPSIGNAL SIGTERM 0B <missing> 7 days ago /bin/sh -c #(nop) EXPOSE 80 0B <missing> 7 days ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx… 22B <missing> 7 days ago /bin/sh -c set -x && apt-get update && apt… 53.8MB <missing> 7 days ago /bin/sh -c #(nop) ENV NJS_VERSION=1.14.2.0.… 0B <missing> 7 days ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.14.2-… 0B <missing> 7 days ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B <missing> 8 days ago /bin/sh -c #(nop) CMD ["bash"] 0B <missing> 8 days ago /bin/sh -c #(nop) ADD file:5a6d066ba71fb0a47… 55.3MB ``` 定制好新的鏡像后,我們可以從這個鏡像來運行容器: ```bash $ docker container rm -f nginx nginx $ docker container run -d --name nginx -p 80:80 jugggao/nginx:1.0 2235f14c9bcd1ef448fb3f05add36f589a4bbf528b1305d5e2ca8e68cade6694 ``` 現在查看主頁默認就是我們已經修改完成后的主頁了。 ## 上傳鏡像至私有倉庫 如果我們想把定制好的鏡像上傳到我們的私有倉庫里,以后再其他主機上也可以直接 Pull 下來使用。可以使用 `docker image push` 命令將鏡像上傳至私有倉庫里。 首先我們需要在 Docker Hub 上注冊賬號,注冊完成后,你的鏡像名稱里面的「用戶名」字段必須和你注冊的用戶名相同。 ![Docker Hub 用戶名](https://box.kancloud.cn/751a211ea155b98ff6af30eb100ca146_651x475.png) ```bash $ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE jugggao/nginx 1.0 62f1198899f3 17 minutes ago 109M ``` 然后登陸你的 Docker Hub: ```bash $ docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: jugggao Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded ``` 最后上傳鏡像至私有倉庫: ```bash $ docker push jugggao/nginx:1.0 The push refers to repository [docker.io/jugggao/nginx] d6bdc338e75e: Pushed 143b95aeb031: Mounted from library/nginx dad66a2b02ef: Mounted from library/nginx 0a07e81f5da3: Mounted from library/nginx 1.0: digest: sha256:0ac52930ea9ff27072aa66b1a56bd62fa55269da0265994b3ba6425723c00b00 size: 1155 ``` 現在我們可以在 Docker Hub 個人倉庫中看到已經上傳的 Docker 鏡像。 ![Docker 個人鏡像](https://box.kancloud.cn/eea9aaedb122c957e81d35b1c3173479_1270x503.png) 如果我們想在其他主機上使用,指定用戶名來下載個人倉庫中的鏡像: ```bash $ docker pull jugggao/nginx:1.0 ``` ## 總結 我們再來看下這個圖: ![Docker 命令](https://box.kancloud.cn/5f6d7f9fec3705567af54613a84a71ac_812x643.png) 主要有以下內容: 1. 從 Docker Hub 上下載鏡像至宿主機。 2. 根據宿主機上的鏡像來運行容器。 3. 根據容器的變化來提交成新的鏡像。 4. 將新的鏡像上傳至 Docker Hub。 Docker 操作鏡像的命令全部有: ```bash $ docker image --help Usage: docker image COMMAND Manage images Commands: build Build an image from a Dockerfile history Show the history of an image import Import the contents from a tarball to create a filesystem image inspect Display detailed information on one or more images load Load an image from a tar archive or STDIN ls List images prune Remove unused images pull Pull an image or a repository from a registry push Push an image or a repository to a registry rm Remove one or more images save Save one or more images to a tar archive (streamed to STDOUT by default) tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE Run 'docker image COMMAND --help' for more information on a command. ``` Docker 操作容器的命令全部有: ```bash $ docker container --help Usage: docker container COMMAND Manage containers Commands: attach Attach local standard input, output, and error streams to a running container commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem exec Run a command in a running container export Export a container's filesystem as a tar archive inspect Display detailed information on one or more containers kill Kill one or more running containers logs Fetch the logs of a container ls List containers pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container prune Remove all stopped containers rename Rename a container restart Restart one or more containers rm Remove one or more containers run Run a command in a new container start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers wait Block until one or more containers stop, then print their exit codes Run 'docker container COMMAND --help' for more information on a command. ``` 如果你想知道某個命令的具體使用方法,可以進一步的查看幫助,比如: ```bash $ docker container ls --help Usage: docker container ls [OPTIONS] List containers Aliases: ls, ps, list Options: -a, --all Show all containers (default shows just running) -f, --filter filter Filter output based on conditions provided --format string Pretty-print containers using a Go template -n, --last int Show n last created containers (includes all states) (default -1) -l, --latest Show the latest created container (includes all states) --no-trunc Don't truncate output -q, --quiet Only display numeric IDs -s, --size Display total file sizes ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看