第 02 章 基礎設施即服務 Docker(5.0)

操作 Docker 容器

容器是 Docker 又一核心概念。

簡單的說,容器是獨立運行的一個或一組應用,以及它們的運行態環境。對應的,虛擬機可以理解爲模擬運行的一整套操作系統(提供了運行態環境和其他系統環境)和跑在上面的應用。

本章將具體介紹如何來管理一個容器,包括創建、啓動和停止等。

啓動容器

啓動容器有兩種方式,一種是基於鏡像新建一個容器並啓動,另外一個是將在終止狀態(stopped)的容器重新啓動。

因爲 Docker 的容器實在太輕量級了,很多時候用戶都是隨時刪除和新創建容器。

新建並啓動

所需要的命令主要爲 docker run。

例如,下面的命令輸出一個 “Hello World”,之後終止容器。
$ docker run ubuntu:14.04 /bin/echo ‘Hello world’
Hello world

這跟在本地直接執行 /bin/echo ‘hello world’ 幾乎感覺不出任何區別。

下面的命令則啓動一個 bash 終端,允許用戶進行交互。
$ docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#

其中,-t 選項讓Docker分配一個僞終端(pseudo-tty)並綁定到容器的標準輸入上, -i 則讓容器的標準輸入保持打開。

在交互模式下,用戶可以通過所創建的終端來輸入命令,例如
root@af8bae53bdd3:/# pwd
/
root@af8bae53bdd3:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

當利用 docker run 來創建容器時,Docker 在後臺運行的標準操作包括:
•檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
•利用鏡像創建並啓動一個容器
•分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
•從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
•從地址池配置一個 ip 地址給容器
•執行用戶指定的應用程序
•執行完畢後容器被終止

啓動已終止容器

可以利用 docker container start 命令,直接將一個已經終止的容器啓動運行。

容器的核心爲所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,並沒有其它的資源。可以在僞終端中利用 ps 或 top 來查看進程信息。
root@ba267838cc1b:/# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
11 ? 00:00:00 ps

可見,容器中僅運行了指定的 bash 應用。這種特點使得 Docker 對資源的利用率極高,是貨真價實的輕量級虛擬化。

守護態運行

更多的時候,需要讓 Docker 在後臺運行而不是直接把執行命令的結果輸出在當前宿主機下。此時,可以通過添加 -d 參數來實現。

下面舉兩個例子來說明一下。

如果不使用 -d 參數運行容器。
$ docker run ubuntu:17.10 /bin/sh -c “while true; do echo hello world; sleep 1; done”
hello world
hello world
hello world
hello world

容器會把輸出的結果 (STDOUT) 打印到宿主機上面

如果使用了 -d 參數運行容器。
$ docker run -d ubuntu:17.10 /bin/sh -c “while true; do echo hello world; sleep 1; done”
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

此時容器會在後臺運行並不會把輸出的結果 (STDOUT) 打印到宿主機上面(輸出結果可以用 docker logs 查看)。

注: 容器是否會長久運行,是和 docker run 指定的命令有關,和 -d 參數無關。

使用 -d 參數啓動後會返回一個唯一的 id,也可以通過 docker container ls 命令來查看容器信息。
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77b2dc01fe0f ubuntu:17.10 /bin/sh -c ‘while tr 2 minutes ago Up 1 minute agitated_wright

要獲取容器的輸出信息,可以通過 docker container logs 命令。
$ docker container logs [container ID or NAMES]
hello world
hello world
hello world

終止容器

可以使用 docker container stop 來終止一個運行中的容器。

此外,當 Docker 容器中指定的應用終結時,容器也自動終止。

例如對於上一章節中只啓動了一個終端的容器,用戶通過 exit 命令或 Ctrl+d 來退出終端時,所創建的容器立刻終止。

終止狀態的容器可以用 docker container ls -a 命令看到。例如
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ba267838cc1b ubuntu:14.04 “/bin/bash” 30 minutes ago Exited (0) About a minute ago trusting_newton
98e5efa7d997 training/webapp:latest “python app.py” About an hour ago Exited (0) 34 minutes ago backstabbing_pike

處於終止狀態的容器,可以通過 docker container start 命令來重新啓動。

此外,docker container restart 命令會將一個運行態的容器終止,然後再重新啓動它。

進入容器

在使用 -d 參數時,容器啓動後會進入後臺。

某些時候需要進入容器進行操作,包括使用 docker attach 命令或 docker exec 命令,推薦大家使用 docker exec 命令,原因會在下面說明。

attach 命令

docker attach 是 Docker 自帶的命令。下面示例如何使用該命令。
$ docker run -dit ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550

$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest “/bin/bash” 18 seconds ago Up 17 seconds nostalgic_hypatia

$ docker attach 243c
root@243c32535da7:/#

注意: 如果從這個 stdin 中 exit,會導致容器的停止。

exec 命令

-i -t 參數

docker exec 後邊可以跟多個參數,這裏主要說明 -i -t 參數。

只用 -i 參數時,由於沒有分配僞終端,界面沒有我們熟悉的 Linux 命令提示符,但命令執行結果仍然可以返回。

當 -i -t 參數一起使用時,則可以看到我們熟悉的 Linux 命令提示符。
$ docker run -dit ubuntu
69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6

$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69d137adef7a ubuntu:latest “/bin/bash” 18 seconds ago Up 17 seconds zealous_swirles

$ docker exec -i 69d1 bash
ls
bin
boot
dev

$ docker exec -it 69d1 bash
root@69d137adef7a:/#

如果從這個 stdin 中 exit,不會導致容器的停止。這就是爲什麼推薦大家使用 docker exec 的原因。

更多參數說明請使用 docker exec –help 查看。

刪除容器

可以使用 docker container rm 來刪除一個處於終止狀態的容器。例如
$ docker container rm trusting_newton
trusting_newton

如果要刪除一個運行中的容器,可以添加 -f 參數。Docker 會發送 SIGKILL 信號給容器。

清理所有處於終止狀態的容器

用 docker container ls -a 命令可以查看所有已經創建的包括終止狀態的容器,如果數量太多要一個個刪除可能會很麻煩,用下面的命令可以清理掉所有處於終止狀態的容器。
$ docker container prune

訪問 Docker 倉庫

倉庫(Repository)是集中存放鏡像的地方。

一個容易混淆的概念是註冊服務器(Registry)。實際上註冊服務器是管理倉庫的具體服務器,每個服務器上可以有多個倉庫,而每個倉庫下面有多個鏡像。從這方面來說,倉庫可以被認爲是一個具體的項目或目錄。例如對於倉庫地址 dl.dockerpool.com/ubuntu 來說,dl.dockerpool.com 是註冊服務器地址,ubuntu 是倉庫名。

大部分時候,並不需要嚴格區分這兩者的概念

Docker Hub

目前 Docker 官方維護了一個公共倉庫 Docker Hub,其中已經包括了數量超過 15,000 的鏡像。大部分需求都可以通過在 Docker Hub 中直接下載鏡像來實現。

註冊

你可以在 https://cloud.docker.com 免費註冊一個 Docker 賬號。

登錄

可以通過執行 docker login 命令交互式的輸入用戶名及密碼來完成在命令行界面登錄 Docker Hub。

你可以通過 docker logout 退出登錄。

拉取鏡像

你可以通過 docker search 命令來查找官方倉庫中的鏡像,並利用 docker pull 命令來將它下載到本地。

例如以 centos 爲關鍵詞進行搜索:
$ docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 465 [OK]
tianon/centos CentOS 5 and 6, created using rinse instea… 28
blalor/centos Bare-bones base CentOS 6.5 image 6 [OK]
saltstack/centos-6-minimal 6 [OK]
tutum/centos-6.4 DEPRECATED. Use tutum/centos:6.4 instead. … 5 [OK]

可以看到返回了很多包含關鍵字的鏡像,其中包括鏡像名字、描述、收藏數(表示該鏡像的受關注程度)、是否官方創建、是否自動創建。

官方的鏡像說明是官方項目組創建和維護的,automated 資源允許用戶驗證鏡像的來源和內容。

根據是否是官方提供,可將鏡像資源分爲兩類。

一種是類似 centos 這樣的鏡像,被稱爲基礎鏡像或根鏡像。這些基礎鏡像由 Docker 公司創建、驗證、支持、提供。這樣的鏡像往往使用單個單詞作爲名字。

還有一種類型,比如 tianon/centos 鏡像,它是由 Docker 的用戶創建並維護的,往往帶有用戶名稱前綴。可以通過前綴 username/ 來指定使用某個用戶提供的鏡像,比如 tianon 用戶。

另外,在查找的時候通過 –filter=stars=N 參數可以指定僅顯示收藏數量爲 N 以上的鏡像。

下載官方 centos 鏡像到本地。
$ docker pull centos
Pulling repository centos
0b443ba03958: Download complete
539c0211cd76: Download complete
511136ea3c5a: Download complete
7064731afe90: Download complete

推送鏡像

用戶也可以在登錄後通過 docker push 命令來將自己的鏡像推送到 Docker Hub。

以下命令中的 username 請替換爲你的 Docker 賬號用戶名。
$ docker tag ubuntu:17.10 username/ubuntu:17.10

$ docker image ls

REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 17.10 275d79972a86 6 days ago 94.6MB
username/ubuntu 17.10 275d79972a86 6 days ago 94.6MB

$ docker push username/ubuntu:17.10

$ docker search username

NAME DESCRIPTION STARS OFFICIAL AUTOMATED
username/ubuntu

自動創建

自動創建(Automated Builds)功能對於需要經常升級鏡像內程序來說,十分方便。

有時候,用戶創建了鏡像,安裝了某個軟件,如果軟件發佈新版本則需要手動更新鏡像。

而自動創建允許用戶通過 Docker Hub 指定跟蹤一個目標網站(目前支持 GitHub 或 BitBucket)上的項目,一旦項目發生新的提交或者創建新的標籤(tag),Docker Hub 會自動構建鏡像並推送到 Docker Hub 中。

要配置自動創建,包括如下的步驟:
•創建並登錄 Docker Hub,以及目標網站;
•在目標網站中連接帳戶到 Docker Hub;
•在 Docker Hub 中 配置一個自動創建;
•選取一個目標網站中的項目(需要含 Dockerfile)和分支;
•指定 Dockerfile 的位置,並提交創建。

之後,可以在 Docker Hub 的 自動創建頁面 中跟蹤每次創建的狀態。

Docker 私有倉庫

有時候使用 Docker Hub 這樣的公共倉庫可能不方便,用戶可以創建一個本地倉庫供私人使用。

本節介紹如何使用本地倉庫。

docker-registry 是官方提供的工具,可以用於構建私有的鏡像倉庫。本文內容基於 docker-registry v2.x 版本。

安裝運行 docker-registry

容器運行

你可以通過獲取官方 registry 鏡像來運行。
$ docker run -d -p 5000:5000 –restart=always –name registry registry

這將使用官方的 registry 鏡像來啓動私有倉庫。默認情況下,倉庫會被創建在容器的 /var/lib/registry 目錄下。你可以通過 -v 參數來將鏡像文件存放在本地的指定路徑。例如下面的例子將上傳的鏡像放到本地的 /opt/data/registry 目錄。
$ docker run -d \
-p 5000:5000 \
-v /opt/data/registry:/var/lib/registry \
registry

在私有倉庫上傳、搜索、下載鏡像

創建好私有倉庫之後,就可以使用 docker tag 來標記一個鏡像,然後推送它到倉庫。例如私有倉庫地址爲 127.0.0.1:5000。

先在本機查看已有的鏡像。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB

使用 docker tag 將 ubuntu:latest 這個鏡像標記爲 127.0.0.1:5000/ubuntu:latest。

格式爲 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]。
dockertagubuntu:latest127.0.0.1:5000/ubuntu:latest docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu latest ba5877dc9bec 6 weeks ago 192.7 MB
127.0.0.1:5000/ubuntu:latest latest ba5877dc9bec 6 weeks ago 192.7 MB

使用 docker push 上傳標記的鏡像。
$ docker push 127.0.0.1:5000/ubuntu:latest
The push refers to repository [127.0.0.1:5000/ubuntu]
373a30c24545: Pushed
a9148f5200b0: Pushed
cdd3de0940ab: Pushed
fc56279bbb33: Pushed
b38367233d37: Pushed
2aebd096e0e2: Pushed
latest: digest: sha256:fe4277621f10b5026266932ddf760f5a756d2facd505a94d2da12f4f52f71f5a size: 1568

用 curl 查看倉庫中的鏡像。
$ curl 127.0.0.1:5000/v2/_catalog
{“repositories”:[“ubuntu”]}

這裏可以看到 {“repositories”:[“ubuntu”]},表明鏡像已經被成功上傳了。

先刪除已有鏡像,再嘗試從私有倉庫中下載這個鏡像。
$ docker image rm 127.0.0.1:5000/ubuntu:latest

$ docker pull 127.0.0.1:5000/ubuntu:latest
Pulling repository 127.0.0.1:5000/ubuntu:latest
ba5877dc9bec: Download complete
511136ea3c5a: Download complete
9bad880da3d2: Download complete
25f11f5fb0cb: Download complete
ebc34468f71d: Download complete
2318d26665ef: Download complete

$ docker image ls
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
127.0.0.1:5000/ubuntu:latest latest ba5877dc9bec 6 weeks ago 192.7 MB

注意事項

如果你不想使用 127.0.0.1:5000 作爲倉庫地址,比如想讓本網段的其他主機也能把鏡像推送到私有倉庫。你就得把例如 192.168.199.100:5000 這樣的內網地址作爲私有倉庫地址,這時你會發現無法成功推送鏡像。

這是因爲 Docker 默認不允許非 HTTPS 方式推送鏡像。我們可以通過 Docker 的配置選項來取消這個限制,或者查看下一節配置能夠通過 HTTPS 訪問的私有倉庫。

Ubuntu 14.04, Debian 7 Wheezy

對於使用 upstart 的系統而言,編輯 /etc/default/docker 文件,在其中的 DOCKER_OPTS 中增加如下內容:
DOCKER_OPTS=”–registry-mirror=https://registry.docker-cn.com –insecure-registries=192.168.199.100:5000”

重新啓動服務。
$ sudo service docker restart

Ubuntu 16.04+, Debian 8+, centos 7

對於使用 systemd 的系統,請在 /etc/docker/daemon.json 中寫入如下內容(如果文件不存在請新建該文件)
{
“registry-mirrors”: [
https://registry.docker-cn.com
],
“insecure-registries”: [
“192.168.199.100:5000”
]
}

注意:該文件必須符合 json 規範,否則 Docker 將不能啓動。

其他

對於 Docker for Windows 、 Docker for Mac 在設置中編輯 daemon.json 增加和上邊一樣的字符串即可。

數據卷

數據卷 是一個可供一個或多個容器使用的特殊目錄,它繞過 UFS,可以提供很多有用的特性:
•數據卷 可以在容器之間共享和重用
•對 數據卷 的修改會立馬生效
•對 數據卷 的更新,不會影響鏡像
•數據卷 默認會一直存在,即使容器被刪除

注意:數據卷 的使用,類似於 Linux 下對目錄或文件進行 mount,鏡像中的被指定爲掛載點的目錄中的文件會隱藏掉,能顯示看的是掛載的 數據卷。

選擇 -v 還是 -–mount 參數

Docker 新用戶應該選擇 –mount 參數,經驗豐富的 Docker 使用者對 -v 或者 –volume 已經很熟悉了,但是推薦使用 –mount 參數。

創建一個數據卷
$ docker volume create my-vol

查看所有的 數據卷
$ docker volume ls

local my-vol

在主機裏使用以下命令可以查看指定 數據卷 的信息
$ docker volume inspect my-vol
[
{
“Driver”: “local”,
“Labels”: {},
“Mountpoint”: “/var/lib/docker/volumes/my-vol/_data”,
“Name”: “my-vol”,
“Options”: {},
“Scope”: “local”
}
]

啓動一個掛載數據卷的容器

在用 docker run 命令的時候,使用 –mount 標記來將 數據卷 掛載到容器裏。在一次 docker run 中可以掛載多個 數據卷。

下面創建一個名爲 web 的容器,並加載一個 數據卷 到容器的 /webapp 目錄。
$ docker run -d -P \
–name web \
# -v my-vol:/wepapp \
–mount source=my-vol,target=/webapp \
training/webapp \
python app.py

查看數據卷的具體信息

在主機裏使用以下命令可以查看 web 容器的信息
$ docker inspect web

數據卷 信息在 “Mounts” Key 下面
“Mounts”: [
{
“Type”: “volume”,
“Name”: “my-vol”,
“Source”: “/var/lib/docker/volumes/my-vol/_data”,
“Destination”: “/app”,
“Driver”: “local”,
“Mode”: “”,
“RW”: true,
“Propagation”: “”
}
],

刪除數據卷
$ docker volume rm my-vol

數據卷 是被設計用來持久化數據的,它的生命週期獨立於容器,Docker 不會在容器被刪除後自動刪除 數據卷,並且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的 數據卷。如果需要在刪除容器的同時移除數據卷。可以在刪除容器的時候使用 docker rm -v 這個命令。

無主的數據卷可能會佔據很多空間,要清理請使用以下命令
$ docker volume prune

Docker 構建 Tomcat

查找 Docker Hub 上的 Tomcat 鏡像
root@UbuntuBase:/usr/local/docker/tomcat# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementa… 1550 [OK]
dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba… 43 [OK]
tomee Apache TomEE is an all-Apache Java EE cert… 42 [OK]
davidcaste/alpine-tomcat Apache Tomcat 7/8 using Oracle Java 7/8 wi… 21 [OK]
consol/tomcat-7.0 Tomcat 7.0.57, 8080, “admin/admin” 16 [OK]
cloudesire/tomcat Tomcat server, 6/7/8 15 [OK]
maluuba/tomcat7 9 [OK]
tutum/tomcat Base docker image to run a Tomcat applicat… 8
jeanblanchard/tomcat Minimal Docker image with Apache Tomcat 8
andreptb/tomcat Debian Jessie based image with Apache Tomc… 7 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 5 [OK]
aallam/tomcat-mysql Debian, Oracle JDK, Tomcat & MySQL 4 [OK]
antoineco/tomcat-mod_cluster Apache Tomcat with JBoss mod_cluster 1 [OK]
maluuba/tomcat7-java8 Tomcat7 with java8. 1
amd64/tomcat Apache Tomcat is an open source implementa… 1
primetoninc/tomcat Apache tomcat 8.5, 8.0, 7.0 1 [OK]
trollin/tomcat 0
fabric8/tomcat-8 Fabric8 Tomcat 8 Image 0 [OK]
awscory/tomcat tomcat 0
oobsri/tomcat8 Testing CI Jobs with different names. 0
hegand/tomcat docker-tomcat 0 [OK]
s390x/tomcat Apache Tomcat is an open source implementa… 0
ppc64le/tomcat Apache Tomcat is an open source implementa… 0
99taxis/tomcat7 Tomcat7 0 [OK]
qminderapp/tomcat7 Tomcat 7 0

這裏我們拉取官方的鏡像
docker pull tomcat

等待下載完成後,我們就可以在本地鏡像列表裏查到 REPOSITORY 爲 tomcat 的鏡像。

運行容器:
docker run –name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat

命令說明:
•-p 8080:8080:將容器的8080端口映射到主機的8080端口
•-v $PWD/test:/usr/local/tomcat/webapps/test:將主機中當前目錄下的test掛載到容器的/test

查看容器啓動情況
root@UbuntuBase:/usr/local/docker/tomcat/webapps# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38498e53128c tomcat “catalina.sh run” 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp tomcat
通過瀏覽器訪問
這裏寫圖片描述

Docker 構建 MySQL

查找 Docker Hub 上的 MySQL 鏡像
root@UbuntuBase:/usr/local/docker/mysql# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relati… 5177 [OK]
mariadb MariaDB is a community-developed fork of M… 1602 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Crea… 361 [OK]
percona Percona Server is a fork of the MySQL rela… 298 [OK]
hypriot/rpi-mysql RPi-compatible Docker Image with Mysql 72
zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 62 [OK]
centurylink/mysql Image containing mysql. Optimized to be li… 53 [OK]
sameersbn/mysql 48 [OK]
zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server … 36 [OK]
tutum/mysql Base docker image to run a MySQL database … 27
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 17 [OK]
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic back… 16 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 15
linuxserver/mysql A Mysql container, brought to you by Linux… 12
centos/mysql-56-centos7 MySQL 5.6 SQL database server 6
openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 ima… 6
frodenas/mysql A Docker Image for MySQL 3 [OK]
dsteinkopf/backup-all-mysql backup all DBs in a mysql server 3 [OK]
circleci/mysql MySQL is a widely used, open-source relati… 2
cloudposse/mysql Improved mysql service with support for … 0 [OK]
astronomerio/mysql-sink MySQL sink 0 [OK]
ansibleplaybookbundle/rhscl-mysql-apb An APB which deploys RHSCL MySQL 0 [OK]
cloudfoundry/cf-mysql-ci Image used in CI of cf-mysql-release 0
astronomerio/mysql-source MySQL source 0 [OK]
jenkler/mysql Docker Mysql package 0

這裏我們拉取官方的鏡像
docker pull mysql

等待下載完成後,我們就可以在本地鏡像列表裏查到 REPOSITORY 爲 mysql 的鏡像

運行容器:
docker run -p 3306:3306 –name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql

命令參數:
•-p 3306:3306:將容器的3306端口映射到主機的3306端口
•-v /usr/local/docker/mysql/conf:/etc/mysql:將主機當前目錄下的 conf 掛載到容器的 /etc/mysql
•-v /usr/local/docker/mysql/logs:/var/log/mysql:將主機當前目錄下的 logs 目錄掛載到容器的 /var/log/mysql
•-v /usr/local/docker/mysql/data:/var/lib/mysql:將主機當前目錄下的 data 目錄掛載到容器的 /var/lib/mysql
•-e MYSQL_ROOT_PASSWORD=123456:初始化root用戶的密碼

查看容器啓動情況
root@UbuntuBase:/usr/local/docker/mysql# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc49c9de4cdf mysql:latest “docker-entrypoint…” 4 minutes ago Up 4 minutes 0.0.0.0:3306->3306/tcp mysql

使用客戶端工具連接 MySQL
​​​

這裏寫圖片描述

Docker 常用命令

查看 Docker 版本
docker version

從 Docker 文件構建 Docker 映像
docker build -t image-name docker-file-location

運行 Docker 映像
docker run -d image-name

查看可用的 Docker 映像
docker images

查看最近的運行容器
docker ps -l

查看所有正在運行的容器
docker ps -a

停止運行容器
docker stop container_id

刪除一個鏡像
docker rmi image-name

刪除所有鏡像
docker rmi $(docker images -q)

強制刪除所有鏡像
docker rmi -r $(docker images -q)

刪除所有爲 的鏡像
docker rmi $(docker images -q -f dangling=true)

刪除所有容器
docker rm $(docker ps -a -q)

進入 Docker 容器
docker exec -it container-id /bin/bash

查看所有數據卷
docker volume ls

刪除指定數據卷
docker volume rm [volume_name]

刪除所有未關聯的數據卷
docker volume rm $(docker volume ls -qf dangling=true)

從主機複製文件到容器
sudo docker cp host_path containerID:container_path

從容器複製文件到主機
sudo docker cp containerID:container_path host_path

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章