docker常用命令

docker常用命令

通過上圖,我們可以看到docker的架構:

  • Client——docker的客戶端,給Docker daemon發送請求,操控Docker daemon如何運行。
  • Docker CLI文檔
  • DOCKER_HOST——docker守護進程所在服務器。
  • 一般為linux系統的電腦/服務器
  • 如果本地開發/學習/調試使用,可以安裝docker for window或者docker for Mac
  • Docker daemon——docker守護進程(也可以理解為docker的服務端),用於拉取鏡像(Images)、運行容器(Containers)等操作
  • 目前分為 社區版:Docker Engine - Community
  • 企業版:Docker Enterprise
  • Images——鏡像
    。可以理解為可運行的軟件包。
  • 可以根據Dockerfile,使用dokcer build命令構建一個鏡像。(Dockerfile:描述鏡像構建過程的配置文件)
  • 可以把自己構建好的本地鏡像使用docker push命令推送到遠程鏡像註冊中心(Registry)
  • Containers——容器。通過鏡像(Images)創建出容器(Containers)。容器可以運行/停止。
  • Container是在原先的Image之上新加的一層,稱作Container layer,這一層是可讀可寫的(Image是隻讀的)。
  • Image跟Container的職責區別:Image負責APP的存儲和分發,Container負責運行APP。
  • Registry——鏡像註冊中心。就是鏡像的遠程倉庫。
  • Docker Hub是Docker官方維護的公共鏡像註冊中心。https://hub.docker.com(科學上網預警)
  • 也可以自己搭建鏡像註冊中心。

docker images

描述:查看鏡像

用法:

docker images [OPTIONS] [REPOSITORY[:TAG]]

舉例:

[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 2ca708c1c9cc 6 days ago 64.2 MB
docker.io/zookeeper latest eb0a01329223 11 days ago 225 MB
docker.io/elasticsearch 7.3.2 d7052f192d01 2 weeks ago 706 MB
docker.io/kibana 7.1.0 714b175e84e8 4 months ago 745 MB
docker.io/elasticsearch 7.1.0 12ad640a1ec0 4 months ago 894 MB
docker.io/lmenezes/cerebro 0.8.3 3a2daf87f0c7 5 months ago 333 MB
[root@localhost ~]# docker images ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu latest 2ca708c1c9cc 6 days ago 64.2 MB
[root@localhost ~]#

docker search

描述:從遠程registry中搜索鏡像(默認的registry是Docker hub,可能需要科學上網......)

用法:

docker search [OPTIONS] TERM

舉例:

[root@localhost ~]# docker search java
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/node Node.js is a JavaScript-based platform for... 7907 [OK]
docker.io docker.io/tomcat Apache Tomcat is an open source implementa... 2524 [OK]
docker.io docker.io/java Java is a concurrent, class-based, and obj... 1976 [OK]
docker.io docker.io/openjdk OpenJDK is an open-source implementation o... 1887 [OK]
docker.io docker.io/ghost Ghost is a free and open source blogging p... 1029 [OK]

docker.io docker.io/jetty Jetty provides a Web server and javax.serv... 314 [OK]
docker.io docker.io/groovy Apache Groovy is a multi-faceted language ... 77 [OK]
docker.io docker.io/lwieske/java-8 Oracle Java 8 Container - Full + Slim - Ba... 45 [OK]
docker.io docker.io/nimmis/java-centos This is docker images of CentOS 7 with dif... 42 [OK]
docker.io docker.io/fabric8/java-jboss-openjdk8-jdk Fabric8 Java Base Image (JBoss, OpenJDK 8) 28 [OK]
docker.io docker.io/cloudbees/java-build-tools Docker image with commonly used tools to b... 15 [OK]
docker.io docker.io/frekele/java docker run --rm --name java frekele/java 12 [OK]
docker.io docker.io/blacklabelops/java Java Base Images. 8 [OK]
docker.io docker.io/bitnami/java Bitnami Java Docker Image 5 [OK]
docker.io docker.io/rightctrl/java Oracle Java 3 [OK]
docker.io docker.io/zoran/java10-sjre Slim Docker image based on AlpineLinux wit... 2 [OK]
docker.io docker.io/buildo/java8-wkhtmltopdf Java 8 + wkhtmltopdf 1 [OK]
docker.io docker.io/cfje/java-buildpack Java Buildpack CI Image 1
docker.io docker.io/cfje/java-resource Java Concourse Resource 1
docker.io docker.io/cfje/java-test-applications Java Test Applications CI Image 1
docker.io docker.io/dwolla/java Dwolla’s custom Java image 1 [OK]
docker.io docker.io/cfje/java-buildpack-dependency-builder Java Buildpack Dependencies Builder Image 0
docker.io docker.io/cfje/java-buildpack-memory-calculator Java Buildpack Memory Calculator CI Image 0
docker.io docker.io/jelastic/javaengine An image of the Java Engine server maintai... 0
docker.io docker.io/thingswise/java-docker Java + dcd 0 [OK]
[root@localhost ~]#

docker pull

描述:從Registry拉取一個鏡像(images)或一個倉庫(repository)

用法:

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

常用OPTIONS:

--all-tags , -a
Download all tagged images in the repository

舉例:

[root@localhost ~]# docker search java
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/node Node.js is a JavaScript-based platform for... 7907 [OK]
docker.io docker.io/tomcat Apache Tomcat is an open source implementa... 2524 [OK]
docker.io docker.io/java Java is a concurrent, class-based, and obj... 1976 [OK]
docker.io docker.io/openjdk OpenJDK is an open-source implementation o... 1887 [OK]

docker.io docker.io/ghost Ghost is a free and open source blogging p... 1029 [OK]
docker.io docker.io/jetty Jetty provides a Web server and javax.serv... 314 [OK]
docker.io docker.io/groovy Apache Groovy is a multi-faceted language ... 77 [OK]
docker.io docker.io/lwieske/java-8 Oracle Java 8 Container - Full + Slim - Ba... 45 [OK]
docker.io docker.io/nimmis/java-centos This is docker images of CentOS 7 with dif... 42 [OK]
docker.io docker.io/fabric8/java-jboss-openjdk8-jdk Fabric8 Java Base Image (JBoss, OpenJDK 8) 28 [OK]
docker.io docker.io/cloudbees/java-build-tools Docker image with commonly used tools to b... 15 [OK]
docker.io docker.io/frekele/java docker run --rm --name java frekele/java 12 [OK]
docker.io docker.io/blacklabelops/java Java Base Images. 8 [OK]
docker.io docker.io/bitnami/java Bitnami Java Docker Image 5 [OK]
docker.io docker.io/rightctrl/java Oracle Java 3 [OK]
docker.io docker.io/zoran/java10-sjre Slim Docker image based on AlpineLinux wit... 2 [OK]
docker.io docker.io/buildo/java8-wkhtmltopdf Java 8 + wkhtmltopdf 1 [OK]
docker.io docker.io/cfje/java-buildpack Java Buildpack CI Image 1
docker.io docker.io/cfje/java-resource Java Concourse Resource 1
docker.io docker.io/cfje/java-test-applications Java Test Applications CI Image 1
docker.io docker.io/dwolla/java Dwolla’s custom Java image 1 [OK]
docker.io docker.io/cfje/java-buildpack-dependency-builder Java Buildpack Dependencies Builder Image 0
docker.io docker.io/cfje/java-buildpack-memory-calculator Java Buildpack Memory Calculator CI Image 0
docker.io docker.io/jelastic/javaengine An image of the Java Engine server maintai... 0
docker.io docker.io/thingswise/java-docker Java + dcd 0 [OK]
[root@localhost ~]# docker pull java
Using default tag: latest
Trying to pull repository docker.io/library/java ...
sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d: Pulling from docker.io/library/java
5040bd298390: Downloading [======================================> ] 39.05 MB/51.36 MB
fce5728aad85: Download complete
76610ec20bf5: Downloading [==========================================> ] 36.18 MB/42.5 MB
60170fec2151: Download complete
e98f73de8f0d: Download complete
11f7af24ed9c: Download complete
49e2d6393f32: Downloading [=======> ] 18.9 MB/130.1 MB
bb9cdec9c7f3: Waiting

上面是鏡像正在下載中顯示的內容。

下面是容器下載成功之後,顯示的內容:

[root@localhost ~]# docker pull java
Using default tag: latest
Trying to pull repository docker.io/library/java ...
sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d: Pulling from docker.io/library/java
5040bd298390: Pull complete
fce5728aad85: Pull complete
76610ec20bf5: Pull complete
60170fec2151: Pull complete

e98f73de8f0d: Pull complete
11f7af24ed9c: Pull complete
49e2d6393f32: Pull complete
bb9cdec9c7f3: Pull complete
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for docker.io/java:latest ##註釋:這裡提示新的鏡像已經下載成功。
[root@localhost ~]# docker images ##註釋:查看本機有哪些鏡像
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/java latest d23bdf5b1b1b 2 years ago 643 MB
[root@localhost ~]#

docker rmi

描述:刪除本地鏡像

用法:

docker rmi [OPTIONS] IMAGE [IMAGE...]

舉例:

docker images查看當前存在java這個鏡像(image)

[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/java latest d23bdf5b1b1b 2 years ago 643 MB

docker rmi java刪除java這個鏡像

[root@localhost ~]# docker rmi java
Untagged: java:latest
Untagged: docker.io/java@sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Deleted: sha256:d23bdf5b1b1b1afce5f1d0fd33e7ed8afbc084b594b9ccf742a5b27080d8a4a8
Deleted: sha256:0132aeca1bc9ac49d397635d34675915693a8727b103639ddee3cc5438e0f60a
Deleted: sha256:c011315277e16e6c88687a6c683e388e2879f9a195113129a2ca12f782d9fcf9
Deleted: sha256:3181aa7c07970b525de9d3bd15c4c3710a2ab49fd5927df41e5586d9b89b1480
Deleted: sha256:b0053647bc72f97b7a9709a505a20a7a74a556c6aa025979e36532ff3df7cb8d
Deleted: sha256:0877f4904e80b44741cc07706b19c6d415724b20128f4b26ee59faec9a859416
Deleted: sha256:dbf7b16cf5d32dfec3058391a92361a09745421deb2491545964f8ba99b37fc2

Deleted: sha256:4cbc0ad7007fe8c2dfcf2cdc82fdb04f35070f0e2a04d5fa35093977a3cc1693
Deleted: sha256:a2ae92ffcd29f7ededa0320f4a4fd709a723beae9a4e681696874932db7aee2c
[root@localhost ~]# docker

docker images發現java這個鏡像(image)已經被刪除了。

[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@localhost ~]#

docker ps

描述:查看docker運行中的容器

用法:

docker ps [OPTIONS]

參數:

--all , -a 
顯示所有容器 (默認只顯示運行(running)中的容器)
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9c6299ea3dd9 ubuntu "echo 'hello world..." 17 hours ago Exited (0) 17 hours ago elegant_ramanujan
9ea1ee424001 docker.io/elasticsearch:7.3.2 "/usr/local/bin/do..." 19 hours ago Up 18 hours 9200/tcp, 9300/tcp es7_02
3704143fe6cd docker.io/kibana:7.1.0 "/usr/local/bin/ki..." 19 hours ago Up 18 hours 0.0.0.0:5601->5601/tcp kibana7
5ce37aebf865 lmenezes/cerebro:0.8.3 "/opt/cerebro/bin/..." 19 hours ago Up 18 hours 0.0.0.0:9000->9000/tcp cerebro
5f046e5a2a52 docker.io/elasticsearch:7.3.2 "/usr/local/bin/do..." 19 hours ago Up 18 hours 0.0.0.0:9200->9200/tcp, 9300/tcp es7_01
[root@localhost ~]#

docker rm

描述:這個是刪除已停止的容器(container)

用法:

docker rm [OPTIONS] CONTAINER [CONTAINER...]

舉例:

[root@localhost ~]# docker ps -a | grep ubuntu ##查看ubuntu相關的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker run ubuntu ##使用ubuntu鏡像(image)啟動一個容器(container)
[root@localhost ~]# docker ps -a | grep ubuntu ##查看ubuntu相關的容器
242158aba8b3 ubuntu "/bin/bash" 9 seconds ago Exited (0) 8 seconds ago kind_booth
[root@localhost ~]# docker rm ubuntu ##這裡報錯原因是:ubuntu是鏡像名,而不是容器id或容器名
Error response from daemon: No such container: ubuntu
[root@localhost ~]# docker rm 242158aba8b3 ##指定容器id,刪除容器。
242158aba8b3
[root@localhost ~]# docker ps -a | grep ubuntu
[root@localhost ~]#

docker run

描述:

在一個新的容器中,運行一個命令

用法:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

常用參數:

--env , -e
Set environment variables
--expose
Expose a port or a range of ports
--publish , -p
Publish a container’s port(s) to the host
--hostname , -h
Container host name

--name
Assign a name to the container
--rm
Automatically remove the container when it exits
--volume , -v
Bind mount a volume
--interactive , -i
Keep STDIN open even if not attached
--tty , -t
Allocate a pseudo-TTY

舉例:(以下使用不同的參數,來舉例說明每個參數的作用。)

1、為運行的容器標記一個容器名稱,並分配一個可操作容器的終端 【--name】【-i】【-t】

[root@localhost ~]# docker run --name ubuntu_container_name -it ubuntu 
root@ae89a95bc79a:/# uname -a ##當前這是在ubuntu_container_name容器中。
Linux ae89a95bc79a 3.10.0-1062.1.1.el7.x86_64 #1 SMP Fri Sep 13 22:55:44 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
root@ae89a95bc79a:/# exit ##退出ubuntu_container_name容器
exit
[root@localhost ~]# uname -a ## 在本地機器上
Linux localhost.localdomain 3.10.0-1062.1.1.el7.x86_64 #1 SMP Fri Sep 13 22:55:44 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# docker ps -a | grep ubuntu_container_name ##查看ubuntu_container_name容器進程
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ae89a95bc79a ubuntu "/bin/bash" 2 minutes ago Exited (0) About a minute ago ubuntu_container_name
[root@localhost ~]#

如果再次執行上面docker run命令,則會報錯:

[root@localhost ~]# docker run --name ubuntu_container_name -it ubuntu
/usr/bin/docker-current: Error response from daemon: Conflict. The container name "/ubuntu_container_name" is already in use by container ae89a95bc79aa96f871df6cfa1148765c8fcead8015e15663c5da62e02c72b1f. You have to remove (or rename) that container to be able to reuse that name..
See '/usr/bin/docker-current run --help'.
[root@localhost ~]#

可以看到,錯誤信息說:名為"/ubuntu_container_name"的容器,已經被ae89a95bc79aa96f871df6cfa1148765c8fcead8015e15663c5da62e02c72b1f(這個是容器id)使用。你必須remove或者rename那個容器,才能使用這個容器名稱。

所以我們可以使用docker rm刪除已經停止的容器:

[root@localhost ~]# docker rm ubuntu_container_name
ubuntu_container_name
[root@localhost ~]#

然後在此使用docker run,就可以啟動成功了:

[root@localhost ~]# docker run --name ubuntu_container_name -it ubuntu
root@969073543bb8:/# exit
exit
[root@localhost ~]#

由此可以知道:docker使用一個鏡像(image)(這裡我們使用的鏡像名稱為ubuntu)創建一個容器(container),容器(container)在停止之後,其實並不會自動刪除這個容器(container)。(後面會講解docker start命令,用於啟動一個停止的容器。)

2、以守護進程運行【-d】

[root@localhost ~]# docker run -d busybox top
Unable to find image 'busybox:latest' locally
Trying to pull repository docker.io/library/busybox ...
sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e: Pulling from docker.io/library/busybox
7c9d20b9b6cd: Pull complete
Digest: sha256:fe301db49df08c384001ed752dff6d52b4305a73a7f608f21528048e8a08b51e
Status: Downloaded newer image for docker.io/busybox:latest
e2b848c56857d83f948dfb2f14739b2e45c036cb42cbb03e510f9bab1ea47b4f
[root@localhost ~]#

最後一行輸出的,是啟動後的容器id。

docker ps看一下運行中的容器:

[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2b848c56857 busybox "top" 42 seconds ago Up 41 seconds inspiring_knuth

使用docker logs -f [Container]來查看一下這個容器的日誌:

docker常用命令

3、發佈容器內的端口[-p]

如果容器中的應用開啟了端口,比如nginx的80端口,比如tomcat的8080端口。

默認情況下,在容器和容器之間,是可以訪問的,但是在docker之外,是無法訪問容器內的端口的。

此時,如果要從容器外,也能訪問容器內的端口,則需要把容器內的端口發佈出來。也可以理解把容器外的端口和容器內的端口進項關聯。就要用到-p參數。

[root@localhost ~]# docker run -d nginx
b60a89eb08ba1946051fe94f874d0641fe37889fb739b403f589b2cc170dff05
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b60a89eb08ba nginx "nginx -g 'daemon ..." 17 seconds ago Up 17 seconds 80/tcp nervous_kare

以上命令使用nginx鏡像,以守護進程方式-d啟動了容器,容器id為:b60a89eb08ba1946051fe94f874d0641fe37889fb739b403f589b2cc170dff05

此時,我們查看一下服務器上的端口信息:並沒有80端口。

[root@localhost ~]# netstat -tln | grep 80
[root@localhost ~]# netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
tcp6 0 0 :::22 :::* LISTEN
[root@localhost ~]#

而我們使用-p參數,把本機81端口綁定到容器內80端口

[root@localhost ~]# docker run -d -p 81:80 nginx 
88f0ab45b75f4149f25480a354b2415bfd117405735e0e3bcce86f25c52e7e7d
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
88f0ab45b75f nginx "nginx -g 'daemon ..." 7 seconds ago Up 6 seconds 0.0.0.0:81->80/tcp trusting_shockley
## 註釋:docker ps輸出的PORTS字段內容為:0.0.0.0:81->80/tcp 這裡就表示本機81端口綁定到容器內的80端口
[root@localhost ~]# netstat -tln | grep 81 ##此時查看,本機存在81端口
tcp6 0 0 :::81 :::* LISTEN
[root@localhost ~]#

我們訪問本機81端口:其實最終就是訪問到了容器中的80端口,而容器中的80端口,就是nginx的端口。

[root@localhost ~]# curl http://localhost:81



<title>Welcome to nginx!/<title>



Welcome to nginx!


If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.


For online documentation and support please refer to
.



Commercial support is available at
.


Thank you for using nginx.




[root@localhost ~]#

docker run 和 docker start區別

docker run

The docker run command first creates a writeable container layer over the specified image, and then starts it using the specified command.

That is, docker run is equivalent to the API /containers/create then /containers/(id)/start.

A stopped container can be restarted with all its previous changes intact using docker start.

docker run 命令首先使用指定的鏡像,創建一個可寫的容器層,然後啟動新創建的容器。

也就是說,docker run 相當於docker create 之後docker start

一個已停止的容器可以擁有所有私有改動重新啟動,通過docker start命令。

docker start

Start one or more stopped containers

啟動一個或多個已停止的容器。

docker create

The docker create command creates a writeable container layer over the specified image and prepares it for running the specified command. The container ID is then printed to STDOUT.

This is similar to docker run -d except the container is never started.

除了這個容器沒有被啟動過,docker create命令和執行docker run -d是很類似的。

You can then use the docker start <container> command to start the container at any point./<container>

docker-compose

使用docker-compose可以把docker命令都寫到配置文件中,命令更簡潔,編排更整齊。

這裡使用搭建ZooKeeper三節點集群舉例子:

### 備註:使用docker-compose命令啟動容器,-f zookeeper-compose.yml指定使用的編排配置文件;up -d表示在後臺啟動容器。
[root@localhost ~]# docker-compose -f zookeeper-compose.yml up -d
Starting zk2_cname ... done
Starting zk3_cname ... done
Starting zk1_cname ... done
### 備註:查看啟動的docker容器。
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
360300c685fa registry.newbanker.cn:5000/zookeeper "/docker-entrypoint.…" 6 days ago Up 6 seconds 2888/tcp, 3888/tcp, 0.0.0.0:2182->2181/tcp zk2_cname
2bf59a1f9fa0 registry.newbanker.cn:5000/zookeeper "/docker-entrypoint.…" 6 days ago Up 6 seconds 2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp zk1_cname
063172618f7f registry.newbanker.cn:5000/zookeeper "/docker-entrypoint.…" 6 days ago Up 6 seconds 2888/tcp, 3888/tcp, 0.0.0.0:2183->2181/tcp zk3_cname
### 備註:查看docker-compose的配置文件,即zookeeper-compose.yml

[root@localhost ~]# cat zookeeper-compose.yml
version: '3' ##compose配置文件的版本;文檔:https://docs.docker.com/compose/compose-file(下面有可直接點擊的鏈接)
services:
zk1: ##
image: registry.newbanker.cn:5000/zookeeper ##使用我公司的ZooKeeper的鏡像##
container_name: zk1_cname ##容器名稱##
ports:
- "2181:2181" ##把本機2181端口綁定到容器內2181端口;等價於docker run -p 2181:2181##
environment: ##指定環境變量;因為使用的registry.newbanker.cn:5000/zookeeper鏡像裡會讀取以下環境變量,作為zk的配置文件zoo.conf##
ZOO_MY_ID: 1
ZOO_SERVERS: server.1=0.0.0.0:2888:3888 server.2=zk2_cname:2888:3888 server.3=zk3_cname:2888:3888
volumes: ##數據持久化##
- "/zkdata/zk1_data:/data"
- "/zkdata/zk1_datalog:/datalog"
zk2:
image: registry.newbanker.cn:5000/zookeeper
container_name: zk2_cname
ports:
- "2182:2181" ##把本機2182端口綁定到容器內2181端口;等價於docker run -p 2182:2181##
environment:
ZOO_MY_ID: 2
ZOO_SERVERS: server.1=zk1_cname:2888:3888 server.2=0.0.0.0:2888:3888 server.3=zk3_cname:2888:3888
volumes:
- "/zkdata/zk2_data:/data"
- "/zkdata/zk2_datalog:/datalog"
zk3:
image: registry.newbanker.cn:5000/zookeeper
container_name: zk3_cname
ports:
- "2183:2181" ##把本機2183端口綁定到容器內2181端口;等價於docker run -p 2183:2181##
environment:
ZOO_MY_ID: 3
ZOO_SERVERS: server.1=zk1_cname:2888:3888 server.2=zk2_cname:2888:3888 server.3=0.0.0.0:2888:3888
volumes:
- "/zkdata/zk3_data:/data"
- "/zkdata/zk3_datalog:/datalog"

雖然使用docker-compose,需要編寫配置文件,而且有很多重複的,但是畢竟相比docker run命令來搭建,整體命令要整潔的多。

大家有興趣可以使用docker run命令來搭建一下以上ZooKeeper集群(不要問我為啥沒有在博客中寫docker run命令搭建ZooKeeper集群的完整命令,因為太難了。溜了溜了。。。。)

docker-compose文檔:https://docs.docker.com/compose/reference/overview/

compose配置文件的版本——文檔:https://docs.docker.com/compose/compose-file/

備註:registry.newbanker.cn:5000/zookeeper是我公司的私有鏡像,大家應該沒有地方下載此鏡像,這無所謂,可以隨便找一個ZooKeeper鏡像來搭建ZooKeeper集群:

使用docker search zookeeper命令來搜索ZooKeeper鏡像:這裡使用start最高的zookeeper鏡像就行。

### 備註: 使用docker search zookeeper命令來搜索ZooKeeper鏡像
[root@localhost ~]# docker search zookeeper
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
zookeeper Apache ZooKeeper is an open-source server wh… 724 [OK]
jplock/zookeeper Builds a docker image for Zookeeper version … 165 [OK]
wurstmeister/zookeeper 96 [OK]
mesoscloud/zookeeper ZooKeeper 73 [OK]
mbabineau/zookeeper-exhibitor 24 [OK]
digitalwonderland/zookeeper Latest Zookeeper - clusterable 20 [OK]
bitnami/zookeeper ZooKeeper is a centralized service for distr… 16 [OK]

confluent/zookeeper 13 [OK]
tobilg/zookeeper-webui Docker image for using `zk-web` as ZooKeeper… 11 [OK]
### 備註:使用docker pull zookeeper命令把遠程鏡像拉取到本地。
[root@localhost ~]# docker pull zookeeper
.......................這裡省略拉取日誌.....................
### 備註:查看本地docker鏡像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zookeeper latest eb0a01329223 4 days ago 225MB

docker-tags

[root@localhost bin]# cat docker-tags 
#!/bin/bash
API="https://registry.hub.docker.com/v1/repositories"
DEFAULT_NAME="nginx"
DEFAULT_TIMEOUT=3
function Usage(){
cat << HELP
Usage: docker-tags NAME[:TAG]
docker-tags list all tags for docker image on a remote registry.
Example:
docker-tags (default nginx)
docker-tags nginx
docker-tags nginx:1.15.8
docker search nginx | docker-tags
docker search nginx | docker-tags :1.15.8
echo nginx | docker-tags
echo nginx | docker-tags :1.15.8
HELP
}
ARG=$1
if [[ "$ARG" =~ "-h" ]];then
Usage
exit 0
fi
function ParseJson(){
tr -d '[\\[\\]" ]' | tr '}' '\\n' | awk -F: -v image=$1 '{if(NR!=NF && $3 != ""){printf("%s:%s\\n",image,$3)}}'
}
function GetTags(){
image=$1
tag=$2
ret=`curl -s ${API}/${image}/tags`
tag_list=`echo $ret | ParseJson ${image}`
if [ -z "$tag" ];then
echo -e "$tag_list"

else
echo -e "$tag_list" | grep -w "$tag"
fi
}
if [ -z $ARG ] || [[ ${ARG:0:1} == ":" ]];then
if [ -x /usr/bin/timeout ];then
images=`timeout $DEFAULT_TIMEOUT` awk '{print $1}' | grep -v "NAME" || echo $DEFAULT_NAME
else
images=`awk '{print $1}' | grep -v "NAME"`
fi
else
images=`echo $ARG | awk -F: '{print $1}'`
fi
tag=`echo $ARG | awk -F: '{print $2}'`
for i in ${images}
do
tags=`GetTags $i $tag`
count=`echo $tags | wc -w`
if [[ $count -gt 0 ]];then
echo -e "IMAGE [$i:$tag]:"
echo -e "$tags"
echo
fi
done
[root@localhost bin]#


分享到:


相關文章: