Docker安裝與基本操作

0x01 核心概念

Docker鏡像類似于虛擬機(jī)鏡像,可以理解為一個(gè)面向Docker引擎的只讀模板辱士,包含了文件系統(tǒng)泪掀。鏡像是創(chuàng)建Docker容器的基礎(chǔ)。

Docker容器類似于一個(gè)輕量級(jí)的沙箱颂碘,Docker利用容器來(lái)運(yùn)行和隔離應(yīng)用异赫。容器是從鏡像創(chuàng)建的應(yīng)用運(yùn)行實(shí)例,可以將其啟動(dòng)头岔、停止塔拳、刪除,而這些容器都是相互隔離峡竣、互不可見的靠抑。
鏡像自身是只讀的。容器從鏡像啟動(dòng)的時(shí)候适掰,Docker會(huì)在鏡像的最上層創(chuàng)建一個(gè)可寫層颂碧,鏡像本身將保持不變荠列。

Docker倉(cāng)庫(kù)類似于代碼倉(cāng)庫(kù),是Docker集中存放鏡像文件的場(chǎng)所稚伍。Docker倉(cāng)庫(kù)分為公開倉(cāng)庫(kù)和私有倉(cāng)庫(kù)弯予。

注冊(cè)服務(wù)器(Registry)是存放倉(cāng)庫(kù)的地方,其上往往存放著多個(gè)倉(cāng)庫(kù)个曙。每個(gè)倉(cāng)庫(kù)集中存放某一類鏡像锈嫩,往往包括多個(gè)鏡像文件,通過(guò)不同的標(biāo)簽(tag)來(lái)進(jìn)行區(qū)分垦搬。

0x02 Docker安裝

1呼寸、Ubuntu

Ubuntu 14.04 版本官方軟件源中已經(jīng)自帶了Docker包,較低版本需要先進(jìn)行內(nèi)核更新并重啟系統(tǒng):

$ sudo apt-get update
$ sudo apt-get install -y linux-image-generic-lts-raring linux-headers-generic-lts-raring
$ sudo reboot

安裝Docker

$ sudo apt-get update
$ sudo apt-get install -y docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io

系統(tǒng)默認(rèn)的Docker安裝包相對(duì)較舊猴贰,可通過(guò)以下方式從Docker官方源安裝最新版本对雪。

$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get -y lxc-docker

2、CentOS

2.1米绕、CentOS 6

$ sudo yum install -y http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
$ sudo yum install -y docker-io

2.2瑟捣、CentOS 7

$ sudo yum install -y docker

更新方式:自行通過(guò)源碼編譯安裝;下載二進(jìn)制文件更新栅干。

3迈套、Windows

Docker通過(guò)虛擬機(jī)方式支持Windows 7和8,前提是主機(jī)的CPU支持硬件虛擬化碱鳞。

  • https://docs.docker.com/installation/windows/下載最新官方Docker for Windows Installer桑李。

  • 運(yùn)行Installer,該過(guò)程將安裝VirtualBox窿给,MSYS-git贵白,boot2docker Linux ISO鏡像,以及Boot2Docker管理工具崩泡。

  • 打開桌面的Boot2Docker Start程序禁荒,或者用以下命令:Program Files > Boot2Docker for Windows。此初始化腳本在第一次運(yùn)行時(shí)需要輸入一個(gè)SSH Key Passphrase(用于SSH密鑰生成的口令)角撞,也可直接跳過(guò)圈浇。

  • 此時(shí)Boot2Docker Start程序?qū)⑦B接至虛擬機(jī)中的Shell會(huì)話,Docker已經(jīng)運(yùn)行起來(lái)了靴寂。

4、Mac OS

Docker支持Mac OS 10.6 Snow Leopard及以上版本的Mac OS召耘,同樣需要Boot2Docker工具的支持百炬。

  • https://docs.docker.com/installation/mac/下載最新官方Docker for OS X Installer

  • 運(yùn)行安裝包污它,該過(guò)程將安裝一個(gè)VirtualBox虛擬機(jī)剖踊,Docker本身以及Boot2Docker管理工具庶弃。

  • 安裝成功,找到Boot2Docker并運(yùn)行它德澈,現(xiàn)在進(jìn)行Boot2Docker的初始化:

$ boot2docker init
$ boot2docker start
$ $(boot2docker shellinit)
  • 看到虛擬機(jī)在命令行窗口中啟動(dòng)運(yùn)行歇攻,并顯示Docker的啟動(dòng)信息,則說(shuō)明Docker安裝成功梆造。當(dāng)虛擬機(jī)初始化完畢后缴守,可以使用boot2docker stopboot2docker start來(lái)控制它。

  • 注意:如果在命令行中看到如下提示信息:

To connect the Docker client to the Docker daemon, please set: export DOCKER_HOST=tcp://192.168.59.103:2375

可以執(zhí)行提示信息中的語(yǔ)句:export DOCKER_HOST=tcp://192.168.59.103:2375在系統(tǒng)環(huán)境變量中設(shè)置Docker的主機(jī)地址镇辉。

0x03 docker基本操作

1屡穗、鏡像

1.1、獲取鏡像

命令docker pull NAME[:TAG]獲取鏡像忽肛。如不顯式的指定TAG村砂,則默認(rèn)選擇latest標(biāo)簽。

[root@localhost test]# docker pull ubuntu:14.04
14.04: Pulling from library/ubuntu
bae382666908: Pull complete 
29ede3c02ff2: Pull complete 
da4e69f33106: Pull complete 
8d43e5f5d27f: Pull complete 
b0de1abb17d6: Pull complete 
Digest: sha256:6e3e3f3c5c36a91ba17ea002f63e5607ed6a8c8e5fbbddb31ad3e15638b51ebc
Status: Downloaded newer image for ubuntu:14.04

1.2屹逛、查看鏡像信息

命令docker images列出本地主機(jī)上已有的鏡像础废。

[root@localhost test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              747cb2d60bbe        2 weeks ago         122MB
ubuntu              14.04               dea1945146b9        6 weeks ago         188MB

命令docker inspect IMAGE_ID 可以獲取該鏡像的詳細(xì)信息。

[root@localhost test]# docker inspect dea1945146b9
[
    {
        "Id": "sha256:dea1945146b96542e6e20642830c78df702d524a113605a906397db1db022703",
        "RepoTags": [
            "ubuntu:14.04"
        ],
        "RepoDigests": [
            "ubuntu@sha256:6e3e3f3c5c36a91ba17ea002f63e5607ed6a8c8e5fbbddb31ad3e15638b51ebc"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2017-09-13T23:26:23.127186526Z",
        "Container": "53c2a8c09f3e5b092cb05b323a382b2935476bc84353b102922c5c14b2bd3305",
        "ContainerConfig": {
            "Hostname": "53c2a8c09f3e",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/bin/bash\"]"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:2013c3d8a4f2376ef9d2922271c8bc6a913cb3109a34966dbaefe5057a9da766",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "DockerVersion": "17.06.2-ce",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:2013c3d8a4f2376ef9d2922271c8bc6a913cb3109a34966dbaefe5057a9da766",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 187971405,
        "VirtualSize": 187971405,
        "GraphDriver": {
            "Data": {
                "RootDir": "/var/lib/docker/overlay/9da37272f7684597b528479a3f91389673cd37351fd5ce8f51668d3df02af8b1/root"
            },
            "Name": "overlay"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:c47d9b229ca4eaf5d3b85b6fa7f794d00910a42634dd0fd5107a9a937b13b20f",
                "sha256:bf59e7acf5c4eefb6b27e7973a8afa6214f7a6da99c20a94195665ab52d442b2",
                "sha256:48daf661d621ef19b6df743b9fcfcb50044ba34d0b8b5161f4061dba49902e9b",
                "sha256:4e1e6ac5b9d6cde7dabfdaa6a0e8f5a8986c4f8bb63689085fdfaca0ccae698d",
                "sha256:7fb9ba64f896b3a7001af9604a44243cfa663c84e414cd298ee8bc754feb5aa1"
            ]
        }
    }
]

命令docker tag REPOSITORY:TAG可為本地鏡像添加新的標(biāo)簽罕模。

[root@localhost test]# docker tag ubuntu:latest latest_ubuntu:latest
[root@localhost test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              747cb2d60bbe        2 weeks ago         122MB
latest_ubuntu       latest              747cb2d60bbe        2 weeks ago         122MB
ubuntu              14.04               dea1945146b9        6 weeks ago         188MB

1.3评腺、搜索鏡像

docker search命令搜索遠(yuǎn)端倉(cāng)庫(kù)中的共享鏡像。

參數(shù):
--automated=false 僅顯示自動(dòng)創(chuàng)建的鏡像
--no-trunc=false 輸出信息不截?cái)囡@示
-s手销,--starts=0 指定僅顯示評(píng)價(jià)為指定星級(jí)以上的鏡像

下面以搜索mysql為例:

[root@localhost test]# docker search mysql
NAME                                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                                                  MySQL is a widely used, open-source relati...   5160      [OK]       
mariadb                                                MariaDB is a community-developed fork of M...   1598      [OK]       
mysql/mysql-server                                     Optimized MySQL Server Docker images. Crea...   360                  [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                   
schickling/mysql-backup-s3                             Backup MySQL to S3 (supports periodic back...   16                   [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          16                   [OK]
centos/mysql-57-centos7                                MySQL 5.7 SQL database server                   13                   
linuxserver/mysql                                      A Mysql container, brought to you by Linux...   12                   
openshift/mysql-55-centos7                             DEPRECATED: A Centos7 based MySQL v5.5 ima...   6                    
centos/mysql-56-centos7                                MySQL 5.6 SQL database server                   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                    
cloudfoundry/cf-mysql-ci                               Image used in CI of cf-mysql-release            0                    
astronomerio/mysql-sink                                MySQL sink                                      0                    [OK]
cloudposse/mysql                                       Improved `mysql` service with support for ...   0                    [OK]
ansibleplaybookbundle/rhscl-mysql-apb                  An APB which deploys RHSCL MySQL                0                    [OK]
astronomerio/mysql-source                              MySQL source                                    0                    [OK]
jenkler/mysql                                          Docker Mysql package                            0                    

1.4歇僧、刪除鏡像

命令docker rmi IMAGE[IMAGE...]IMAGE可以為標(biāo)簽或ID。使用鏡像ID來(lái)刪除時(shí)锋拖,會(huì)先嘗試刪除所有指向該鏡像的標(biāo)簽诈悍,然后刪除該鏡像文件本身。

注意:當(dāng)有該鏡像創(chuàng)建的容器存在時(shí)兽埃,鏡像文件默認(rèn)是無(wú)法被刪除的侥钳。

docker ps -a命令可以看到本機(jī)上存在的所有容器。

強(qiáng)制刪除鏡像用docker rmi -f IMAGE命令柄错。使用-f參數(shù)來(lái)強(qiáng)制刪除一個(gè)存在容器依賴的鏡像會(huì)造成一些遺留問題舷夺。正確做法是先刪除依賴鏡像的所有容器,再來(lái)刪除鏡像售貌。刪除容器用docker rm CONTAINER_ID命令给猾。

[root@localhost test]# docker ps -a
CONTAINER ID      IMAGE             COMMAND          CREATED           STATUS                            PORTS        NAMES
a40fcdb8f675      ubuntu:latest     "/bin/bash"      5 minutes ago     Exited (127) About a minute ago                agitated_lalande
[root@localhost test]# docker rm a40fcdb8f675
a40fcdb8f675
[root@localhost test]# docker rmi 747cb2d60bbe
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:506e2d5852de1d7c90d538c5332bd3cc33b9cbd26f6ca653875899c505c82687
Deleted: sha256:747cb2d60bbecbda48aff14a8be5c8b913ca69318a6067e57c697f8a78dda06e
Deleted: sha256:ec1fd849ff0a8f0aa2fd1acc29ad5dabbc79b89f63b74a4f54e31a7b0a100aa1
Deleted: sha256:e3f6dffa20cf36460d23bfb22e17be6e5339891f8537f32db79887caf832048b
Deleted: sha256:c213ffdc9f7032702de5a8e9045fcce2353b7221ef6bf4509e02005cfc858f58
Deleted: sha256:3fddf55a451aa43707518f2d8788c12ee5eb1f1e3075433f5bcf4d445d5c275d
Deleted: sha256:0f5ff0cf6a1c53f94b15f03536c490040f233bc455f1232f54cc8eb344a3a368
[root@localhost test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               dea1945146b9        6 weeks ago         188MB

1.5、創(chuàng)建鏡像

基于已有鏡像的容器創(chuàng)建使用命令docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]命令颂跨。

參數(shù):
-a敢伸,--author="" 作者信息
-m,--message"" 提交信息
-p恒削,--pause=true 提交時(shí)暫停容器運(yùn)行

舉例如下:

[root@localhost test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04               dea1945146b9        6 weeks ago         188MB
[root@localhost test]# docker run -ti ubuntu:14.04 /bin/bash
root@098ab9bc25f8:/# touch test
root@098ab9bc25f8:/# exit
exit
[root@localhost test]# docker commit -m "Added a new file" -a "Docker Test" 098ab9bc25f8 test
sha256:68ceff3107a82641378dee544caeed48e6d544b4d74b525051381b7db7479d35
[root@localhost test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                latest              68ceff3107a8        16 seconds ago      188MB
ubuntu              14.04               dea1945146b9        6 weeks ago         188MB

基于本地模板導(dǎo)入使用cat 鏡像壓縮包 | docker import -REPOSITORY:TAG命令池颈。

[root@localhost test]# ls
ubuntu-14.04-x86_64-minimal.tar.gz
[root@localhost test]# cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04-server
sha256:ae63a9e87332075323de0e2cb3e12dd6ea8c6078e006dd937dc0d670c4a8773d
[root@localhost test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04-server        ae63a9e87332        12 seconds ago      215MB
test                latest              68ceff3107a8        About an hour ago   188MB
ubuntu              14.04               dea1945146b9        6 weeks ago         188MB

1.6尾序、存出鏡像

命令docker save -o 壓縮包保存名 REPOSITORY:TAG可存出鏡像。

[root@localhost test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04-server        ae63a9e87332        12 seconds ago      215MB
test                latest              68ceff3107a8        About an hour ago   188MB
ubuntu              14.04               dea1945146b9        6 weeks ago         188MB
[root@localhost test]# docker save -o ubuntu_server.tar ubuntu:14.04
[root@localhost test]# ls
ubuntu_server.tar

1.7躯砰、載入鏡像

命令docker load --input 壓縮包保存名或者docker load < 壓縮包保存名可從導(dǎo)出的文件中重新載入鏡像每币。

[root@localhost test]# ls
ubuntu_server.tar
[root@localhost test]# docker load --input ubuntu_server.tar 
Loaded image: ubuntu:14.04
[root@localhost test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04-server        ae63a9e87332        4 minutes ago       215MB
test                latest              68ceff3107a8        About an hour ago   188MB
ubuntu              14.04               dea1945146b9        6 weeks ago         188MB

1.8、上傳鏡像

可以使用docker push NAME[:TAG]上傳鏡像到倉(cāng)庫(kù)琢歇,默認(rèn)上傳到DockerHub官方倉(cāng)庫(kù)兰怠。第一次使用必須要先登錄。

[root@localhost test]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              14.04-server        ae63a9e87332        4 minutes ago       215MB
test                latest              68ceff3107a8        About an hour ago   188MB
ubuntu              14.04               dea1945146b9        6 weeks ago         188MB
[root@localhost test]# docker tag test:latest username/test:latest
[root@localhost test]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
ubuntu                14.04-server        ae63a9e87332        7 minutes ago       215MB
username/test         latest              68ceff3107a8        About an hour ago   188MB
test                  latest              68ceff3107a8        About an hour ago   188MB
ubuntu                14.04               dea1945146b9        6 weeks ago         188MB
[root@localhost test]# 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: username
Password: 
Login Succeeded
[root@localhost test]# docker push username/test:latest
The push refers to a repository [docker.io/username/test]
786a798121af: Pushed 
7fb9ba64f896: Pushed 
4e1e6ac5b9d6: Pushed 
48daf661d621: Pushed 
bf59e7acf5c4: Pushed 
c47d9b229ca4: Pushed 
latest: digest: sha256:c46955d49b5b7cf15528b94d5c4fb7028b61c52cf00ee4d14073a92379e2237f size: 1566

2矿微、容器

2.1痕慢、創(chuàng)建容器

可以使用docker create命令來(lái)新建一個(gè)容器,新建的容器處于停止?fàn)顟B(tài)涌矢,可以使用docker start CONTAINER_ID命令來(lái)啟動(dòng)它掖举。

[root@localhost test]# docker create -it ubuntu:14.04
1fea7f4a60ec1f33298b69dbbe736c6a3509a3a39756d93c20914f451e857356
[root@localhost test]# docker ps -a
CONTAINER ID     IMAGE            COMMAND          CREATED           STATUS         PORTS   NAMES
1fea7f4a60ec     ubuntu:14.04     "/bin/bash"      17 seconds ago    Created                eager_blackwell
[root@localhost test]# docker start 1fea7f4a60ec
1fea7f4a60ec
[root@localhost test]# docker ps -a
CONTAINER ID     IMAGE            COMMAND          CREATED           STATUS         PORTS   NAMES
1fea7f4a60ec     ubuntu:14.04     "/bin/bash"      2 minutes ago     Up 16 seconds          eager_blackwell

2.2、啟動(dòng)容器

啟動(dòng)容器有兩種方式:基于鏡像新建一個(gè)容器并啟動(dòng)娜庇;將在終止?fàn)顟B(tài)的容器重新啟動(dòng)塔次。所需的命令主要為docker run,等價(jià)于先執(zhí)行docker create名秀,再執(zhí)行docker start励负。

啟動(dòng)一個(gè)bash終端,允許用戶進(jìn)行交互匕得,-t參數(shù)讓Docker分配一個(gè)偽終端并綁定到容器的標(biāo)準(zhǔn)輸入上继榆,-i參數(shù)則讓容器的標(biāo)準(zhǔn)輸入保持打開,-d參數(shù)會(huì)讓Docker容器在后臺(tái)以守護(hù)形式運(yùn)行汁掠,獲取容器輸出信息略吨,可通過(guò)docker logs命令。

[root@localhost test]# docker run -t -i ubuntu:14.04 /bin/bash
root@eac23878c8bf:/# pwd
/
root@eac23878c8bf:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@eac23878c8bf:/# ps
   PID TTY          TIME CMD
     1 pts/0    00:00:00 bash
    15 pts/0    00:00:00 ps
root@eac23878c8bf:/# exit
exit
[root@localhost test]# docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello word; sleep 1; done"
2105fbb444b3b028a1b26ec5879d8d282ccc2fa7d0a9776a8a86e808d3414843
[root@localhost test]# docker ps -a
CONTAINER ID     IMAGE            COMMAND                  CREATED           STATUS             PORTS     NAMES
2105fbb444b3     ubuntu:14.04     "/bin/sh -c 'while..."   11 seconds ago    Up 10 seconds                confident_payne
eac23878c8bf     ubuntu:14.04     "/bin/bash"              2 minutes ago     Exited (0) 2 minutes ago     adoring_shockley
[root@localhost test]# docker logs 2105fbb444b3
hello word
hello word
hello word
hello word
...
[root@localhost test]# docker stop 2105

2.3考阱、終止容器

可以用docker stop [-t|--time [=10]]來(lái)終止一個(gè)運(yùn)行中的容器翠忠。

docker ps -a -q查看處于終止?fàn)顟B(tài)的容器的ID信息。

docker start啟動(dòng)一個(gè)處于終止?fàn)顟B(tài)的容器乞榨。

docker restart將一個(gè)運(yùn)行態(tài)的容器終止然后再重新啟動(dòng)它秽之。

[root@localhost test]# docker stop 2105
2105
[root@localhost test]# docker ps -a -q
2105fbb444b3
eac23878c8bf
[root@localhost test]# docker start 2105
2105
[root@localhost test]# docker ps 
CONTAINER ID     IMAGE            COMMAND                  CREATED           STATUS           PORTS      NAMES
2105fbb444b3     ubuntu:14.04     "/bin/sh -c 'while..."   2 minutes ago     Up 9 seconds                confident_payne
[root@localhost test]# docker restart 2105
2105
[root@localhost test]# docker ps
CONTAINER ID     IMAGE            COMMAND                  CREATED           STATUS           PORTS      NAMES
2105fbb444b3     ubuntu:14.04     "/bin/sh -c 'while..."   3 minutes ago     Up 11 seconds               confident_payne

2.4、進(jìn)入容器

使用-d參數(shù)時(shí)容器會(huì)進(jìn)入后臺(tái)吃既,用戶無(wú)法看到容器中的信息考榨。進(jìn)入容器主要有以下三種方式。

docker attach當(dāng)多個(gè)窗口同時(shí)attach到同一個(gè)容器時(shí)鹦倚,所有窗口都會(huì)同步顯示董虱。當(dāng)某個(gè)窗口因命令阻塞時(shí),其他窗口也無(wú)法執(zhí)行操作。

docker exec官方推薦使用愤诱。

nsenter工具,比較繁瑣捐友,暫時(shí)不做過(guò)多概述淫半。

[root@localhost test]# docker run -tid ubuntu:14.04
0b59f3ef98d47454a314b02d598e8f425855266feb58141178b541fcbdcfc76d
[root@localhost test]# docker ps
CONTAINER ID     IMAGE            COMMAND        CREATED          STATUS          PORTS     NAMES
0b59f3ef98d4     ubuntu:14.04     "/bin/bash"    8 seconds ago    Up 8 seconds              elegant_ride
[root@localhost test]# docker attach elegant_ride
root@0b59f3ef98d4:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@0b59f3ef98d4:/# exit
exit
[root@localhost test]# docker run -tid ubuntu:14.04
a0bb97c292d1fe5d5e507a865c1925251c972dcee30fa65193c06e7ad2aabf0d
[root@localhost test]# docker ps
CONTAINER ID     IMAGE             COMMAND        CREATED          STATUS         PORTS     NAMES
a0bb97c292d1     ubuntu:14.04      "/bin/bash"    6 seconds ago    Up 6 seconds             brave_austin
[root@localhost test]# docker exec -ti a0bb97c292d1 /bin/bash
root@a0bb97c292d1:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@a0bb97c292d1:/# exit
exit

2.5、刪除容器

可以使用docker rm [OPTIONS] CONTAINER [CONTAINER...]命令刪除處于終止?fàn)顟B(tài)的容器匣砖。

參數(shù):
-f科吭,--force=false 強(qiáng)行終止并刪除一個(gè)運(yùn)行中的容器
-l,--link=false 刪除容器的連接猴鲫,但保留容器
-v对人,--volumes=false 刪除容器掛載的數(shù)據(jù)卷

舉例如下:

[root@localhost test]# docker ps -a
CONTAINER ID     IMAGE            COMMAND         CREATED           STATUS                    PORTS      NAMES
a0bb97c292d1     ubuntu:14.04     "/bin/bash"     8 minutes ago     Up 8 minutes                         brave_austin
0b59f3ef98d4     ubuntu:14.04     "/bin/bash"     14 minutes ago    Exited (0) 8 minutes ago             elegant_ride
[root@localhost test]# docker rm 0b59f3ef98d4
0b59f3ef98d4
[root@localhost test]# docker rm -f a0bb97c292d1
a0bb97c292d1
[root@localhost test]# docker ps -a
CONTAINER ID     IMAGE            COMMAND         CREATED           STATUS              PORTS            NAMES

2.6、導(dǎo)入導(dǎo)出容器

導(dǎo)出容器是指導(dǎo)出一個(gè)已經(jīng)創(chuàng)建好的容器到一個(gè)文件拂共,不管此時(shí)這個(gè)容器是否處于運(yùn)行狀態(tài)牺弄,可以使用docker export CONTAINER命令。

[root@localhost test]# docker run -tid ubuntu:14.04
547e74d47ec3eb30736aee22c1b7bf2acd6e71470a1ade4561007a10b3b14a36
[root@localhost test]# docker ps -a
CONTAINER ID     IMAGE            COMMAND          CREATED          STATUS           PORTS       NAMES
547e74d47ec3     ubuntu:14.04     "/bin/bash"      6 seconds ago    Up 5 seconds                 unruffled_jennings
[root@localhost test]# docker export 547 > test.tar
[root@localhost test]# ls
test.tar 

導(dǎo)出的文件又可以使用docker import命令導(dǎo)入宜狐,成為鏡像势告。

[root@localhost test]# ls
test.tar
[root@localhost test]# cat test.tar | docker import - test/ubuntu:v1.0
sha256:1ab7c63a882a9bc13ff4673081a237ba8785d47ba69458bfe976c0e5fc7b9c99
[root@localhost test]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu           v1.0                1ab7c63a882a        22 seconds ago      175MB
ubuntu                14.04-server        ae63a9e87332        2 hours ago         215MB
securityweekly/test   latest              68ceff3107a8        3 hours ago         188MB
ubuntu                14.04               dea1945146b9        6 weeks ago         188MB

3、倉(cāng)庫(kù)

倉(cāng)庫(kù)分為公共倉(cāng)庫(kù)私有倉(cāng)庫(kù)抚恒。

3.1咱台、公共倉(cāng)庫(kù)

官方的公共倉(cāng)庫(kù)為https://hub.docker.com,大部分需求都可以通過(guò)再Docker Hub中直接下載鏡像來(lái)實(shí)現(xiàn)俭驮』啬纾可以通過(guò)docker login命令輸入用戶名、密碼混萝、郵箱來(lái)完成注冊(cè)和登錄遗遵,認(rèn)證信息保存在本地用戶目錄的.dockercfg中。其他操作與前面提到的相同譬圣。

3.2瓮恭、自動(dòng)創(chuàng)建

自動(dòng)創(chuàng)建(Automated Builds)功能對(duì)于需要經(jīng)常升級(jí)景象內(nèi)程序來(lái)說(shuō)十分方便,用戶通過(guò)Docker Hub指定跟蹤一個(gè)目標(biāo)網(wǎng)站(目前支持GitHub或BitBucket)上的項(xiàng)目厘熟,一旦項(xiàng)目發(fā)現(xiàn)新的提交屯蹦,則自動(dòng)執(zhí)行創(chuàng)建。

配置自動(dòng)創(chuàng)建的步驟:

1绳姨、創(chuàng)建并登錄Docker Hub以及目標(biāo)站點(diǎn)登澜,在目標(biāo)站點(diǎn)中連接賬戶到Docker Hub;
2飘庄、在Docker Hub中配置一個(gè)自動(dòng)創(chuàng)建脑蠕;
3、選取一個(gè)目標(biāo)網(wǎng)站中的項(xiàng)目(需要含Dockerfile)和分支;
4谴仙、指定Dockerfile的位置迂求,并提交創(chuàng)建;
5晃跺、之后可以在Docker Hub的“自動(dòng)創(chuàng)建”頁(yè)面中跟蹤每次創(chuàng)建的狀態(tài)揩局。

3.3、私有倉(cāng)庫(kù)

安裝Docker后可通過(guò)官方提供的registry鏡像來(lái)簡(jiǎn)單搭建一套本地私有倉(cāng)庫(kù)環(huán)境掀虎。

啟動(dòng)下載一個(gè)registry容器凌盯,創(chuàng)建本地的私有倉(cāng)庫(kù)服務(wù)。默認(rèn)情況下會(huì)將倉(cāng)庫(kù)創(chuàng)建在容器的/tmp/registry目錄下烹玉,可通過(guò)-v參數(shù)來(lái)將鏡像文件存放在本地的指定路徑上驰怎。此時(shí),在本地將啟動(dòng)一個(gè)私有倉(cāng)庫(kù)服務(wù)二打,監(jiān)聽端口為5000县忌。

[root@localhost test]# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
49388a8c9c86: Pull complete 
638c4c5f80c0: Pull complete 
da6c9df08ef4: Pull complete 
ee7e568878e6: Pull complete 
386d4eddd833: Pull complete 
Digest: sha256:0694e05b6d0b5fed892ddc60358758bd8341c9a6497ac185f93fc4c93c689810
Status: Downloaded newer image for registry:latest
801a921f0e219b6a8535259c06525a6c441ac0528fc977f27504e7519210b88b
[root@localhost test]# docker ps -a
CONTAINER ID     IMAGE       COMMAND                  CREATED              STATUS              PORTS                    NAMES
801a921f0e21     registry    "/entrypoint.sh /e..."   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   fervent_edison

私有倉(cāng)庫(kù)的管理、使用與公共倉(cāng)庫(kù)類似址儒。

4芹枷、數(shù)據(jù)管理

容器中管理數(shù)據(jù)主要有兩種方式:數(shù)據(jù)卷(Data Volumes)和數(shù)據(jù)卷容器(Data Volumes Containers)。

4.1莲趣、數(shù)據(jù)卷

數(shù)據(jù)卷是一個(gè)可供容器使用的特殊目錄鸳慈,它繞過(guò)文件系統(tǒng),可提供很多有用的特性喧伞。

數(shù)據(jù)卷特性:

可在榮期間共享和重用走芋;
對(duì)數(shù)據(jù)卷的修改會(huì)立即生效;
對(duì)數(shù)據(jù)卷更新不會(huì)影響鏡像潘鲫;
卷會(huì)一直存在直到?jīng)]有容器使用翁逞。

在用docker run命令時(shí),使用-v標(biāo)記可以在容器內(nèi)創(chuàng)建一個(gè)數(shù)據(jù)卷溉仑,多次使用-v標(biāo)記可以創(chuàng)建多個(gè)數(shù)據(jù)卷挖函。

[root@localhost test]# docker run -d -p 5000:5000 --name web -v /webapp training/webapp python app.py
932e1f1d871d8292bdc54d2b2007a776fb5286631f79577997604e870a40d441

-v標(biāo)記也可以指定掛載一個(gè)本地的已有目錄到容器中去作為數(shù)據(jù)卷。Docker掛載數(shù)據(jù)卷的默認(rèn)權(quán)限試讀寫(rw)浊竟,可通過(guò)ro指定為只讀怨喘。

[root@localhost test]# docker run -d -p 5000:5000 --name web -v /src/webapp:/opt/webapp:ro /training/webapp python app.py
7e68a0a373a3907aae114114b0c7e479e7c793d3bdec1ed1773ed1f0dfa1db16

-v標(biāo)記也可以從主機(jī)掛載單個(gè)文件到容器中作為數(shù)據(jù)卷。

注意:如果直接掛載一個(gè)文件到容器振定,使用文件編輯工具時(shí)必怜,可能會(huì)造成文件inode的改變,從Docker 1.1.0起后频,這會(huì)導(dǎo)致報(bào)錯(cuò)誤信息梳庆,所以推薦的方式是直接掛載文件所在的目錄暖途。

[root@localhost test]# docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu:14.04 /bin/bash
root@43d2659bf299:/# 

上述命令可以記錄在容器中輸入過(guò)的命令歷史了。

4.2膏执、數(shù)據(jù)卷容器

如果需要在容器間共享一些持續(xù)更新的數(shù)據(jù)驻售,最簡(jiǎn)單的方式是使用數(shù)據(jù)卷容器。數(shù)據(jù)據(jù)容器其實(shí)就是一個(gè)普通的容器胧后,專門用它提供數(shù)據(jù)卷供其它容器掛在使用芋浮。

創(chuàng)建一個(gè)數(shù)據(jù)卷容器dadata并在其中創(chuàng)建一個(gè)數(shù)據(jù)卷掛載到/dbdata

[root@localhost ~]# docker run -it -v /dbdata --name dbdata ubuntu:14.04
root@417a47e1a78d:/# ls
bin   dbdata  etc   lib    media  opt   root  sbin  sys  usr
boot  dev     home  lib64  mnt    proc  run   srv   tmp  var

然后可在其他容器中使用--volumes-from來(lái)掛載dbdata容器中的數(shù)據(jù)卷壳快。

[root@localhost ~]# docker run -it --volumes-from dbdata --name db1 ubuntu:14.04
root@7704b2f5a909:/# exit
exit
[root@localhost ~]# docker run -it --volumes-from dbdata --name db2 ubuntu:14.04
root@e675ebdac602:/# exit
exit
[root@localhost ~]# docker ps -a
CONTAINER ID     IMAGE             COMMAND         CREATED            STATUS                          PORTS   NAMES
e675ebdac602     ubuntu:14.04      "/bin/bash"     10 seconds ago     Exited (0) 6 seconds ago                db2
7704b2f5a909     ubuntu:14.04      "/bin/bash"     23 seconds ago     Exited (0) 15 seconds ago               db1
417a47e1a78d     ubuntu:14.04      "/bin/bash"     18 minutes ago     Exited (0) About a minute ago           dbdata

多個(gè)容器可掛載同一個(gè)數(shù)據(jù)卷到相同的/dbdata目錄,容器任何一方在該目錄下的寫入镇草,其他容器都可以看到眶痰。

root@417a47e1a78d:/# cd /dbdata
root@417a47e1a78d:/dbdata# touch test
root@417a47e1a78d:/dbdata# ls
test
[root@localhost ~]# docker run -it --volumes-from dbdata --name db2 ubuntu:14.04
root@e675ebdac602:/# ls
bin   dbdata  etc   lib    media  opt   root  sbin  sys  usr
boot  dev     home  lib64  mnt    proc  run   srv   tmp  var
[root@localhost ~]# ls dbdata/
test

可以多次使用--volumes-from參數(shù)來(lái)從多個(gè)容器掛載多個(gè)數(shù)據(jù)卷,還可以從其他已經(jīng)掛載了容器卷的容器來(lái)掛載數(shù)據(jù)卷梯啤。使用--volumes-from參數(shù)所掛載數(shù)據(jù)卷的容器自身并不需要保持在運(yùn)行狀態(tài)竖伯。

[root@localhost ~]# docker run -d --name db3 --volumes-from db1 ubuntu:14.04
78b753e6d1a374a347160cfece7464901bed3d06b6ba8444b6bf793cd497fa80

如果刪除了掛載的容器(包括dbdata、db1和db2)因宇,數(shù)據(jù)卷并不會(huì)被自動(dòng)刪除七婴。如果要?jiǎng)h除一個(gè)數(shù)據(jù)卷,必須在刪除最后一個(gè)還掛載著它的容器時(shí)顯式使用docker rm -v命令來(lái)指定同時(shí)刪除關(guān)聯(lián)的容器察滑。

使用數(shù)據(jù)卷容器可以讓用戶在容器之間自由的升級(jí)和移動(dòng)數(shù)據(jù)卷打厘,也可以利用數(shù)據(jù)卷容器對(duì)其中的數(shù)據(jù)卷進(jìn)行備份、恢復(fù)贺辰,以實(shí)現(xiàn)數(shù)據(jù)的遷移户盯。

備份數(shù)據(jù)卷容器中的數(shù)據(jù)卷

[root@localhost ~]# docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu:14.04 tar cvf /backup/backup.tar /dbdata
[root@localhost ~]# ls
backup.tar

命令有點(diǎn)復(fù)雜,詳細(xì)的命令分析如下:

首先利用ubuntu鏡像創(chuàng)建了一個(gè)容器worker饲化;
使用--volumes-from dbdata參數(shù)來(lái)讓worker容器掛載dbdata容器的數(shù)據(jù)卷(即dbdata數(shù)據(jù)卷)莽鸭;
使用-v $(pwd):/backup參數(shù)來(lái)掛載本地的當(dāng)前目錄到worker容器的/backup目錄;
worker容器啟動(dòng)后,使用tar cvf /backup/backup.tar /dbdata命令來(lái)將/dbdata下內(nèi)容備份為容器內(nèi)的/backup/backup.tar,即宿主主機(jī)當(dāng)前目錄下的backup.tar坐慰。

恢復(fù)數(shù)據(jù)到一個(gè)容器

首先創(chuàng)建一個(gè)帶有數(shù)據(jù)卷的容器dbdata2颖榜;

[root@localhost ~]# docker run -v /dbdata --name dbdata2 ubuntu:14.04 /bin/bash
[root@localhost ~]# docker ps -a
CONTAINER ID    IMAGE           COMMAND        CREATED            STATUS                      PORTS     NAMES
0d27d09f57de    ubuntu:14.04    "/bin/bash"    13 seconds ago     Exited (0) 12 seconds ago             dbdata2

然后創(chuàng)建另一個(gè)新的容器,掛載dbdata2的容器燎窘,并使用untar解壓備份文件到所掛載的容器即可。

[root@localhost ~]# ls
backup.tar
[root@localhost ~]# docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
Unable to find image 'busybox:latest' locally
latest: Pulling from library/busybox
03b1be98f3f9: Pull complete 
Digest: sha256:3e8fa85ddfef1af9ca85a5cfb714148956984e02f00bec3f7f49d3925a91e0e7
Status: Downloaded newer image for busybox:latest
dbdata/

5、網(wǎng)絡(luò)基礎(chǔ)配置

5.1氮兵、端口映射

在啟動(dòng)容器時(shí),如果不指定對(duì)應(yīng)參數(shù)歹鱼,在容器外部是無(wú)法通過(guò)網(wǎng)絡(luò)來(lái)訪問容器內(nèi)的網(wǎng)絡(luò)應(yīng)用和服務(wù)的泣栈。

當(dāng)容器中運(yùn)行的一些網(wǎng)絡(luò)應(yīng)用要讓外部訪問時(shí),可以通過(guò)-P-p參數(shù)來(lái)指定端口映射。-P標(biāo)記會(huì)隨機(jī)映射一個(gè)49000~49900的端口至容器內(nèi)部開放的網(wǎng)絡(luò)端口南片。

[root@localhost ~]# docker run -d -P training/webapp python app.py
3fcaa6c3a4985ffb4bc2b6063550ef3e7827877c4dda7dda814d23c9fd782739
[root@localhost ~]# docker ps -l
CONTAINER ID     IMAGE             COMMAND           CREATED          STATUS          PORTS                     NAMES
3fcaa6c3a498     training/webapp   "python app.py"   2 minutes ago    Up 2 minutes    0.0.0.0:32768->5000/tcp   mystifying_lichterman

-p則可以指定要映射的端口掺涛,并且在一個(gè)指定端口上只能綁定一個(gè)容器。支持的格式有:ip:hostPort:containerPort | ip:containerPort | hostPort:containerPort

使用hostPort:containerPort格式將本地的指定端口映射到容器的指定端口疼进。默認(rèn)綁定本地所有接口上的所有地址薪缆。多次使用-p標(biāo)簽可以綁定多個(gè)端口。

[root@localhost ~]# docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
dddb3ced729f593951bc42b4bf1fb69920bca23ff0d79557010ce89fff835c1a
[root@localhost ~]# docker ps -l
CONTAINER ID    IMAGE              COMMAND           CREATED           STATUS            PORTS                                          NAMES
dddb3ced729f    training/webapp    "python app.py"   6 seconds ago     Up 5 seconds      0.0.0.0:5000->5000/tcp, 0.0.0.0:3000->80/tcp   quizzical_agnesi

可以使用ip:hostPort:containerPort格式指定映射使用一個(gè)特定地址伞广。

[root@localhost ~]# docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
4e6d5d31d00213b8d30c45f776b68d5f87bc96dcf87deab65e67386a0cec903b
[root@localhost ~]# docker ps -l
CONTAINER ID     IMAGE              COMMAND            CREATED           STATUS            PORTS                      NAMES
4e6d5d31d002     training/webapp    "python app.py"    8 seconds ago     Up 7 seconds      127.0.0.1:5000->5000/tcp   quizzical_banach 

使用ip::containerPort綁定localhost的任意端口到容器的指定端口拣帽,本地主機(jī)會(huì)自動(dòng)分配一個(gè)端口。

[root@localhost ~]# docker run -d -p 127.0.0.1::5000 training/webapp python app.py
9965b7919951f9a0febd6614a7b8392cb6b625cb3b612ea8975fc23ccc81ae69
[root@localhost ~]# docker ps -l
CONTAINER ID     IMAGE              COMMAND            CREATED           STATUS          PORTS                       NAMES
9965b7919951     training/webapp    "python app.py"    5 seconds ago     Up 4 seconds    127.0.0.1:32768->5000/tcp   optimistic_mahavira

還可以使用udp標(biāo)記來(lái)指定udp端口嚼锄。

[root@localhost ~]# docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
e48e3dfd1b20b20514c2009ab7ee942e88020971cfbcf3e5525ac9ce18c0e3eb
[root@localhost ~]# docker ps -l
CONTAINER ID     IMAGE              COMMAND            CREATED            STATUS           PORTS                                NAMES
e48e3dfd1b20     training/webapp    "python app.py"    8 seconds ago      Up 7 seconds     5000/tcp, 127.0.0.1:5000->5000/udp   gracious_colden

使用docker port來(lái)查看當(dāng)前映射的端口配置减拭,也可查看到綁定的地址。

[root@localhost ~]# docker ps -l
CONTAINER ID     IMAGE              COMMAND            CREATED           STATUS           PORTS                                NAMES
e48e3dfd1b20     training/webapp    "python app.py"    8 seconds ago     Up 7 seconds     5000/tcp, 127.0.0.1:5000->5000/udp   gracious_colden
[root@localhost ~]# docker port gracious_colden 5000/udp
127.0.0.1:5000

5.2区丑、容器互聯(lián)

容器的連接(linking)系統(tǒng)是除了端口映射外另一種可以與容器中應(yīng)用進(jìn)行交互的方式拧粪,它會(huì)在源和接收容器間創(chuàng)建一個(gè)隧道,接收容器可以看到源容器指定的信息沧侥。

連接系統(tǒng)是依據(jù)容器的名稱來(lái)執(zhí)行的可霎,首先需要自定義一個(gè)好記的容器命名,使用--name標(biāo)記可為容器自定義命名宴杀。

容器的名稱是唯一的癣朗,如果命名已存在,需要先用docker rm來(lái)刪除之前創(chuàng)建的同名容器婴氮。

在執(zhí)行docker run的時(shí)候如果添加--rm標(biāo)記斯棒,則容器在終止后會(huì)立刻刪除,--rm-d參數(shù)不能同時(shí)使用主经。

[root@localhost ~]# docker run -d -P --name web training/webapp python app.py
0fad509942452cf778130a4fe48ee1ee1b5b7ac90d1722e87a57bf935edcdcd8
[root@localhost ~]# docker ps -l
CONTAINER ID     IMAGE              COMMAND            CREATED           STATUS           PORTS                     NAMES
0fad50994245     training/webapp    "python app.py"    9 seconds ago     Up 8 seconds     0.0.0.0:32769->5000/tcp   web
[root@localhost ~]# docker inspect -f "{{ .Name }}" 0fad50994245
/web

使用--link參數(shù)可以讓容器之間安全的進(jìn)行交互荣暮。格式為:--link name:alias,其中name是要連接的容器的名稱罩驻,alias是這個(gè)連接的別名穗酥。

Docker在兩個(gè)互聯(lián)的容器間創(chuàng)建了一個(gè)安全隧道,且不用映射它們的端口到宿主主機(jī)上惠遏,避免了暴露數(shù)據(jù)庫(kù)端口到外部網(wǎng)絡(luò)砾跃。

[root@localhost ~]# docker run -d --name db training/postgres
050e569cc50e20cb3b8d41b028204fa51a6d862850b6bb20b2390270de748e2b
[root@localhost ~]# docker run -d -P --name web --link db:db training/webapp python app.py
f8e68cadc083afad5401b001ee223ee9b47ebd447c8fcac71a961be13de39c8a
[root@localhost ~]# docker ps -a
CONTAINER ID      IMAGE                COMMAND                  CREATED              STATUS              PORTS                     NAMES
f8e68cadc083      training/webapp      "python app.py"          8 seconds ago        Up 7 seconds        0.0.0.0:32771->5000/tcp   web
050e569cc50e      training/postgres    "su postgres -c '/..."   About a minute ago   Up About a minute   5432/tcp                  db, web/db

可以看到自定義命名的容器:db和web,db容器的names列有db也有web//db节吮,這表示web容器連接到db容器抽高,允許web容器訪問db容器的信息。

Docker通過(guò)兩種方式為容器公開連接信息:環(huán)境變量透绩;更新/etc/hosts文件翘骂。

使用env命令來(lái)查看web容器的環(huán)境變量壁熄。

[root@localhost ~]# docker run --rm  --name web2 --link db:db training/webapp env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=08f24c59f079
DB_PORT=tcp://172.17.0.3:5432
DB_PORT_5432_TCP=tcp://172.17.0.3:5432
DB_PORT_5432_TCP_ADDR=172.17.0.3
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/web2/db
DB_ENV_PG_VERSION=9.3
HOME=/root

其中DB_開頭的環(huán)境變量是提供web容器連接db容器使用,前綴采用大寫的連接別名碳竟。

除了環(huán)境變量草丧,Docker還添加host信息到父容器的/etc/hosts文件。

[root@localhost ~]# docker run -ti --rm --link db:db training/webapp /bin/bash
root@924a157de540:/opt/webapp# cat /etc/hosts 
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3  db 050e569cc50e
172.17.0.5  924a157de540
root@924a157de540:/opt/webapp# ping db
PING db (172.17.0.3): 56 data bytes
64 bytes from 172.17.0.3: icmp_seq=0 ttl=64 time=0.202 ms
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.157 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.160 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.156 ms
^C--- db ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.156/0.169/0.202/0.000 ms
root@924a157de540:/opt/webapp# 

用戶可連接多個(gè)子容器到父容器莹桅。

6昌执、Dockerfile

Dockerfile是一個(gè)文本格式的配置文件,用戶可使用Dockerfile快速創(chuàng)建自定義鏡像诈泼。

6.1懂拾、基本結(jié)構(gòu)

Dockerfile由一行行命令語(yǔ)句組成,主要分為基礎(chǔ)鏡像信息铐达、維護(hù)者信息委粉、鏡像操作指令容器啟動(dòng)時(shí)指令這四部分,并支持以#開頭的注釋行娶桦。

# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author: docker_user
# Command fromat: Instruction [arguments / command] ..

# 第一行必須指定基于的基礎(chǔ)鏡像
FROM ubuntu

# 維護(hù)者信息
MAINTAINER docker_user docker_user@email.com

# 鏡像的操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

# 容器啟動(dòng)時(shí)執(zhí)行指令
CMD /usr/sbin/nginx
...

在ubuntu父鏡像基礎(chǔ)上安裝inotify-tools、nginx汁汗、apache2衷畦、openssh-server等軟件,創(chuàng)建一個(gè)新的Nginx鏡像知牌。

# Nginx
# 
# VERSION   0.0.1

FROM    ubuntu
MAINTAINER Victor View <victor@docker.com>

RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server

基于ubuntu父鏡像祈争,安裝firefox和vnc軟件,啟動(dòng)后角寸,可通過(guò)5900端口通過(guò)vnc方式使用firefox菩混。

# Firefox over VNC
# 
# VERSION   0.3

FROM    ubuntu
# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir /.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'

EXPOSE 5900
CMD     ["x11vnc", "-forever", "-usepw", "-create"]

6.2、指令

指令的一般格式為INSTRUCTION arguments扁藕,下面分別做詳細(xì)介紹沮峡。

FROM

格式為FROM <image>FROM <image>:<tag>。第一條指令必須為FROM指令亿柑,在同一個(gè)Dockerfile中創(chuàng)建多個(gè)鏡像時(shí)可以使用多個(gè)FROM指令(每個(gè)鏡像一次)邢疙。

MAINTAINER

格式為MAINTAINER <name>,指定維護(hù)者信息望薄。

RUN

格式為RUN <command>RUN ["executable", "param1", "param2"]疟游。前者將在shell終端中運(yùn)行命令,即/bin/sh -c痕支;后者則使用exec執(zhí)行颁虐。指定使用其他終端可以通過(guò)第二種方式實(shí)現(xiàn)。

RUN ["/bin/bash", "-c", "echo hello"]

每條RUN指令將在當(dāng)前鏡像基礎(chǔ)上執(zhí)行指定命令卧须,并提交為新的鏡像另绩,當(dāng)命令較長(zhǎng)時(shí)可使用\來(lái)?yè)Q行儒陨。

CMD

支持三種格式:

  • CMD ["executable", "param1", "param2"],使用exec執(zhí)行板熊,推薦方式框全。

  • CMD command param1 param2,在/bin/sh中執(zhí)行干签,提供給需要交互的應(yīng)用津辩。

  • CMD ["param1", "param2"],提供給ENTRYPOINT的默認(rèn)參數(shù)

指定啟動(dòng)容器時(shí)執(zhí)行的命令容劳,每個(gè)Dockerfile只能有一條CMD命令喘沿,如果指定了多條命令,只有最后一條會(huì)被執(zhí)行竭贩。如果用戶啟動(dòng)容器時(shí)指定了運(yùn)行的命令則會(huì)覆蓋掉CMD指定的命令蚜印。

EXPOSE

格式為EXPOSE <port> [<port>...],告訴Docker服務(wù)端容器暴露的端口號(hào)留量,供互聯(lián)系統(tǒng)使用窄赋。

在啟動(dòng)容器時(shí)需要通過(guò)-P,Docker主機(jī)會(huì)自動(dòng)分配一個(gè)端口轉(zhuǎn)發(fā)到指定的端口楼熄;使用-p則可以具體指定哪個(gè)本地端口映射過(guò)來(lái)忆绰。

ENV

格式ENV <key> <value>,指定一個(gè)環(huán)境變量可岂,會(huì)被后續(xù)RUN指令使用错敢,并在容器運(yùn)行時(shí)保持。

ENV PG_MAJOR    9.3
ENV PG_VERSION  9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgres && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADD

格式ADD <src> <dest>缕粹,復(fù)制指定的<src>到容器中的<dest>稚茅,其中<src>可以是Dockerfile所在目錄的一個(gè)相對(duì)路徑(文件或目錄);也可以是一個(gè)URL平斩;還可以是一個(gè)tar文件(自動(dòng)解壓為目錄)亚享。

COPY

格式COPY <src> <dest>,復(fù)制本地主機(jī)的<src>(為Dockerfile所在目錄的相對(duì)路徑双戳,文件或目錄)為容器中的<dest>虹蒋,目標(biāo)路徑不存在時(shí)會(huì)自動(dòng)創(chuàng)建。

ENTRYPOINT

配置容器啟動(dòng)后執(zhí)行的命令飒货,且不可被docker run提供的參數(shù)覆蓋魄衅。有兩種格式:

  • ENTRYPOINT ["executable", "param1", "param2"]

  • ENTRYPOINT command param1 param2,shell中執(zhí)行塘辅。

每個(gè)Dockerfile中只能有一個(gè)ENTRYPOINT晃虫,當(dāng)指定多個(gè)ENTRYPOINT時(shí),只有最后一個(gè)生效扣墩。

VOLUME

格式VOLUME ["/data"]哲银,創(chuàng)建一個(gè)可以從本地主機(jī)或其他容器掛載的掛載點(diǎn)扛吞,一般用來(lái)存放數(shù)據(jù)庫(kù)和需要保持的數(shù)據(jù)等。

USER

格式USER daemon荆责,指定運(yùn)行容器時(shí)的用戶名或UID滥比,后續(xù)的RUN也會(huì)使用指定用戶。

當(dāng)服務(wù)不需要管理員權(quán)限時(shí)做院,可通過(guò)該命令指定運(yùn)行用戶盲泛,并可在之前創(chuàng)建所需要的用戶。要臨時(shí)獲取管理員權(quán)限可使用gosu键耕,而不推薦sudo寺滚。

WORKDIR

格式WORKDIR /path/to/workdir,為后續(xù)的RUN屈雄、CMD村视、ENTRYPOINT指令配置工作目錄。

可以使用多個(gè)WORKDIR指令酒奶,后續(xù)命令如果參數(shù)是相對(duì)路徑蚁孔,則會(huì)基于之前命令指定的路徑。

WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
# 最終路徑為/a/b/c

ONBUILD

格式ONBUILD [INSTRUCTION]惋嚎,配置當(dāng)前所創(chuàng)建的鏡像作為其他新創(chuàng)建的基礎(chǔ)鏡像時(shí)所執(zhí)行的操作指令勒虾。

鏡像image-A Dockerfile

[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]

基于image-A創(chuàng)建新鏡像,新的Dockerfile中使用FROM images-A指定基礎(chǔ)鏡像時(shí)瘸彤,會(huì)自動(dòng)執(zhí)行ONBUILD指令內(nèi)容,等價(jià)于在后面添加了兩條指令笛钝。

FROM images-A

# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的鏡像推薦在標(biāo)簽中注明质况。例如ruby:1.9-onbuild

6.3玻靡、創(chuàng)建鏡像

編寫完Dockerfile后结榄,可以通過(guò)docker build命令來(lái)創(chuàng)建鏡像。

基本格式為docker build[選項(xiàng)] 路徑囤捻,該命令讀取指定路徑下(包括子目錄)的Dockerfile臼朗,并將該路徑下所有內(nèi)容發(fā)送給Docker服務(wù)端,由服務(wù)端來(lái)創(chuàng)建鏡像蝎土,因此视哑,一般建議放置Dockerfile的目錄為空目錄。也可通過(guò).dockerignore文件(每行添加一條匹配模式)來(lái)讓Docker忽略路徑下的目錄和文件誊涯。

要指定鏡像的標(biāo)簽信息挡毅,可通過(guò)-t選項(xiàng)。

# 指定Dockerfile所在路徑為/tmp/docker_builder/暴构,且希望生成鏡像標(biāo)簽為build_repo/first_image
[root@localhost ~]# docker build -t build_repo/first_image /tmp/docker_builder/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跪呈,一起剝皮案震驚了整個(gè)濱河市段磨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌耗绿,老刑警劉巖苹支,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異误阻,居然都是意外死亡债蜜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門堕绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)策幼,“玉大人,你說(shuō)我怎么就攤上這事奴紧√亟悖” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵黍氮,是天一觀的道長(zhǎng)唐含。 經(jīng)常有香客問我,道長(zhǎng)沫浆,這世上最難降的妖魔是什么捷枯? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮专执,結(jié)果婚禮上淮捆,老公的妹妹穿的比我還像新娘。我一直安慰自己本股,他們只是感情好攀痊,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拄显,像睡著了一般苟径。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躬审,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天棘街,我揣著相機(jī)與錄音,去河邊找鬼承边。 笑死遭殉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的博助。 我是一名探鬼主播恩沽,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼翔始!你這毒婦竟也來(lái)了罗心?” 一聲冷哼從身側(cè)響起里伯,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渤闷,沒想到半個(gè)月后疾瓮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡飒箭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年狼电,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弦蹂。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肩碟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凸椿,到底是詐尸還是另有隱情削祈,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布脑漫,位于F島的核電站髓抑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏优幸。R本人自食惡果不足惜吨拍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望网杆。 院中可真熱鬧羹饰,春花似錦、人聲如沸碳却。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)追城。三九已至,卻和暖如春燥撞,著一層夾襖步出監(jiān)牢的瞬間座柱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工物舒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留色洞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓冠胯,卻偏偏與公主長(zhǎng)得像火诸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子荠察,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容