ubuntu docker

2017/2/12 posted in  云计算和大数据
  • release
    ## 安装docker

docker几个版本更新的比较快,我们按照官方给出的方法来安装docker

可以参考这篇gitbook

为了比较方便学习,采用手动的方式来进行安装

$ sudo apt-get update
###安装https和证书,现在大多数镜像源都采取https的模式了
$ sudo apt-get install apt-transport-https ca-certificates
###添加gpg秘钥,这步很重要,否则就没有办法继续安装
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
###将docker的源添加到apt-get的源里面去
$ echo "deb https://apt.dockerproject.org/repo ubuntu-trusty main" | sudo tee /etc/apt/sources.list.d/docker.list
###更新源并安装
$ sudo apt-get update
$ sudo apt-get install docker-engine
###启动
$ sudo service docker start
###只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket
$ sudo groupadd docker
$ sudo usermod -aG docker $USER

###检查安装情况
$ sudo docker info

使用docker

运行docker ubuntu 容器

$ docker run -i -t ubuntu /bin/bash

运行第一个docker命令,-i标识保证容器中的STDIN是开启的,-t命令告诉docker为要创建的docker容器创建一个伪tty终端。

ubuntu标识创建的镜像名称,当前的ubuntu镜像是一个基础镜像,有docker公司提供。镜像创建的流程是:检查本地是否存在ubuntu镜像,如果本地不存在,则向Docker Hub Registry上注册,查看Docker Hub 中是否存在该镜像。找到该镜像之后下载到本地镜像中来。

root@firephoenix-virtual-machine:~# docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
8aec416115fd: Downloading 12.69 MB/50.31 MB
8aec416115fd: Downloading 18.79 MB/50.31 MB
8aec416115fd: Downloading 20.31 MB/50.31 MB
8aec416115fd: Downloading 24.37 MB/50.31 MB
2508cbcde94b: Download complete
8aec416115fd: Retrying in 1 second

8aec416115fd: Pull complete
695f074e24e3: Pull complete
946d6c48c2a7: Pull complete
bc7277e579f0: Pull complete
2508cbcde94b: Pull complete
Digest: sha256:71cd81252a3563a03ad8daee81047b62ab5d892ebbfbf71cf53415f29c130950
Status: Downloaded newer image for ubuntu:latest

直接从docker hub上面下载会有些慢,需要稍微多等一下

使用容器

前面启动了容器并制定了使用_bin_bash来创建,所以进入后就直接进入到了容器的界面

root@11dab611cdcd:/# hostname
11dab611cdcd
root@11dab611cdcd:/# 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.2  11dab611cdcd
root@11dab611cdcd:/# ip a
bash: ip: command not found
root@11dab611cdcd:/# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  18312  3364 ?        Ss   04:10   0:00 /bin/bash
root        18  0.0  0.0  34424  2768 ?        R+   04:12   0:00 ps -aux
root@11dab611cdcd:/#

输入exit的时候就可以退出了,同时容器也停止运行了。

root@firephoenix-virtual-machine:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
11dab611cdcd        ubuntu              "/bin/bash"         5 minutes ago       Exited (0) 47 seconds ago                       sleepy_jepsen

从状态可以看到容器的状态已经变味 exited 。

容器命名

可以指定—name 参数来为docker容器指定相应的容器名,方便唯一区分。
从下面可以看出指定docker的名称主要影响到docker的名称,但是不会改变容器的主机名。

root@firephoenix-virtual-machine:~# docker run --name test_ubuntu_container -i -t ubuntu /bin/bash
root@2cb6824d5457:/#

从下面看到docker的名称已经改变。

root@firephoenix-virtual-machine:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
2cb6824d5457        ubuntu              "/bin/bash"         5 minutes ago       Exited (0) 2 seconds ago                        test_ubuntu_container
11dab611cdcd        ubuntu              "/bin/bash"         18 minutes ago      Exited (0) 13 minutes ago                       sleepy_jepsen

容器的名称在docker平台全局唯一

重新使用docker

前面使用exit命令会退出docker容器,同时容器的状态会置为exited,如果我们想再次使用的话,需要首先启动docker容器,使用docker start命令。这样容器会启动,但是此时仅仅是看到容器开始运行了。如果我们需要再次进入到交互式会话,我们需要使用docker attach , 这样就会再次进入到交互命令

root@firephoenix-virtual-machine:~# docker start test_ubuntu_container
test_ubuntu_container
root@firephoenix-virtual-machine:~# docker attach test_ubuntu_container
root@2cb6824d5457:/#

创建守护式容器

前面的我们成为交互式运行容器 (interactive container),交互式容器在退出之后就会自动关闭,很多情况下是不可用的。

我们可以创建长期运行的守护式容器(daemonized container),它没有交互式会话,适合运行应用程序和服务。

root@firephoenix-virtual-machine:~# docker run --name daemon_container -d ubuntu /bin/sh -c "while true; do echo hello world;sleep 1; done"
270ffa9c294c9014a42bf7613d3b31203b516dcf93c1ea75304efd809c66e36f

可以查看容器状态

root@firephoenix-virtual-machine:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
270ffa9c294c        ubuntu              "/bin/sh -c 'while..."   2 minutes ago       Up 2 minutes                                    daemon_container
2cb6824d5457        ubuntu              "/bin/bash"              15 minutes ago      Exited (0) 3 minutes ago                        test_ubuntu_container
11dab611cdcd        ubuntu              "/bin/bash"              28 minutes ago      Exited (0) 23 minutes ago                       sleepy_jepsen

容器内部

使用docker logs 加上容器名称可以获取容器日志。

root@firephoenix-virtual-machine:~# docker logs daemon_container
hello world
hello world
###-f输出最新的日志信息
root@firephoenix-virtual-machine:~# docker logs -f daemon_container
hello world
hello world

docker logs —tail 10 daemon_container可以用来获取日志的最后10行内容
docker logs —tail 0 -f daemon_container可以跟踪容器的最新日志

加上-t 标识可以为每条日志加上时间戳

查看容器内的进程

使用 top命令可以查看容器里面的进程信息

root@firephoenix-virtual-machine:~# docker top daemon_container
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                12768               12741               0                   12:35               ?                   00:00:00            /bin/sh -c while true; do echo hello world;sleep 1; done
root                13739               12768               0                   12:46               ?                   00:00:00            sleep 1

容器内部运行进程

可以使用exec 在容器内部运行进行,也可以打开shell 式的交互任务。

root@firephoenix-virtual-machine:~# docker top daemon_container
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                12768               12741               0                   12:35               ?                   00:00:00            /bin/sh -c while true; do echo hello world;sleep 1; done
root                13739               12768               0                   12:46               ?                   00:00:00            sleep 1
root@firephoenix-virtual-machine:~# docker exec -d daemon_container touch /etc/new_config_file
root@firephoenix-virtual-machine:~# docker top daemon_container
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                12768               12741               0                   12:35               ?                   00:00:00            /bin/sh -c while true; do echo hello world;sleep 1; done
root                13938               12768               0                   12:47               ?                   00:00:00            sleep 1
root@firephoenix-virtual-machine:~# docker exec -t -i daemon_container /bin/bash
root@270ffa9c294c:/#
root@270ffa9c294c:/#

使用exec 增加的运行时bash的时候,此时使用exit退出会退出交互式进程,而不会将容器的状态变为exit。

root@270ffa9c294c:/# exit
exit

root@firephoenix-virtual-machine:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
270ffa9c294c        ubuntu              "/bin/sh -c 'while..."   15 minutes ago      Up 15 minutes                                   daemon_container
2cb6824d5457        ubuntu              "/bin/bash"              28 minutes ago      Exited (0) 16 minutes ago                       test_ubuntu_container
11dab611cdcd        ubuntu              "/bin/bash"              40 minutes ago      Exited (0) 35 minutes ago                       sleepy_jepsen

停止守护式容器

使用docker stop命令可以停止当前运行docker容器,使用ps命令可以查看停止的容器状态被职位exited

root@firephoenix-virtual-machine:~# docker stop daemon_container
daemon_container
root@firephoenix-virtual-machine:~#
root@firephoenix-virtual-machine:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
270ffa9c294c        ubuntu              "/bin/sh -c 'while..."   17 minutes ago      Exited (137) 3 seconds ago                       daemon_container
2cb6824d5457        ubuntu              "/bin/bash"              30 minutes ago      Exited (0) 18 minutes ago                        test_ubuntu_container
11dab611cdcd        ubuntu              "/bin/bash"              42 minutes ago      Exited (0) 38 minutes ago                        sleepy_jepsen

也可以使用docker kill 命令向容器发送SIGKILL 信号来停止服务。 这个可以更快的停止容器。

自动重启容器

$ docker run --restart=always --name daemon_container -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

restart 标识被置为always标识的时候,无论容器的退出代码是什么,Docker都会自动重启该容器。

也可以将restart的状态置为on-failure , 标识当容器的退出代码是非0时,docker会尝试自动重启。

—restart=on-failure:5

深入了解容器

docker inspect 命令可以比 docker ps 更深入的了解容器,获得更多的容器信息

root@firephoenix-virtual-machine:~# docker inspect daemon_container
[
    {
        "Id": "270ffa9c294c9014a42bf7613d3b31203b516dcf93c1ea75304efd809c66e36f",
        "Created": "2017-02-02T04:35:31.661730931Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true; do echo hello world;sleep 1; done"
        ],
        "State": {
            "Status": "exited",
            "Running": false,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 0,
            "ExitCode": 137,
            "Error": "",
            "StartedAt": "2017-02-02T04:35:31.9503424Z",
            "FinishedAt": "2017-02-02T04:53:00.431822428Z"
        },
        "Image": "sha256:f49eec89601e8484026a8ed97be00f14db75339925fad17b440976cffcbfb88a",
        "ResolvConfPath": "/var/lib/docker/containers/270ffa9c294c9014a42bf7613d3b31203b516dcf93c1ea75304efd809c66e36f/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/270ffa9c294c9014a42bf7613d3b31203b516dcf93c1ea75304efd809c66e36f/hostname",
        "HostsPath": "/var/lib/docker/containers/270ffa9c294c9014a42bf7613d3b31203b516dcf93c1ea75304efd809c66e36f/hosts",
        "LogPath": "/var/lib/docker/containers/270ffa9c294c9014a42bf7613d3b31203b516dcf93c1ea75304efd809c66e36f/270ffa9c294c9014a42bf7613d3b31203b516dcf93c1ea75304efd809c66e36f-json.log",
        "Name": "/daemon_container",
        "RestartCount": 0,
        "Driver": "aufs",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": null,
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DiskQuota": 0,
            "KernelMemory": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": -1,
            "OomKillDisable": false,
            "PidsLimit": 0,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0
        },
        "GraphDriver": {
            "Name": "aufs",
            "Data": null
        },
        "Mounts": [],
        "Config": {
            "Hostname": "270ffa9c294c",
            "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",
                "while true; do echo hello world;sleep 1; done"
            ],
            "Image": "ubuntu",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {}
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "90c58dd0a89061f7a78284415e336621bdc34faa445490670c39e9c4d5058192",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": null,
            "SandboxKey": "/var/run/docker/netns/90c58dd0a890",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "",
            "Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "MacAddress": "",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "44878f28c0179eae980d634628a80e1290cb41d2a5e68fe815299823bc630a9a",
                    "EndpointID": "",
                    "Gateway": "",
                    "IPAddress": "",
                    "IPPrefixLen": 0,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": ""
                }
            }
        }
    }
]

同样可以使用 -f来查询部分结果,-f支持GO语言模型。

也可以通过浏览_var_lib/docker 目录来深入了解docker容器的管理。

删除容器

root@firephoenix-virtual-machine:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
270ffa9c294c        ubuntu              "/bin/sh -c 'while..."   27 minutes ago      Exited (137) 10 minutes ago                       daemon_container
2cb6824d5457        ubuntu              "/bin/bash"              41 minutes ago      Exited (0) 28 minutes ago                         test_ubuntu_container
11dab611cdcd        ubuntu              "/bin/bash"              53 minutes ago      Exited (0) 48 minutes ago                         sleepy_jepsen
root@firephoenix-virtual-machine:~# docker rm 11dab611cdcd
11dab611cdcd
root@firephoenix-virtual-machine:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
270ffa9c294c        ubuntu              "/bin/sh -c 'while..."   27 minutes ago      Exited (137) 10 minutes ago                       daemon_container
2cb6824d5457        ubuntu              "/bin/bash"              41 minutes ago      Exited (0) 29 minutes ago                         test_ubuntu_container

可以使用docker rm 加上 容器的container id来删除容器

同时也可以全部删除

root@firephoenix-virtual-machine:~# docker rm `docker ps -a -q`
270ffa9c294c
2cb6824d5457
root@firephoenix-virtual-machine:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

docker 镜像和仓库

docker镜像

Docker镜像是由文件系统叠加而成,最底层是一个引导文件系统,即bootfs,类似典型的Linux引导文件系统。

当一个容器启动后,它将被移动到内存中,而引导文件系统则会被卸载,以留出更多的内存供initrd磁盘镜像使用。

Docker镜像的第二层是root文件系统rootfs,它位于引导文件系统之上。rootfs是一种或多种操作系统(如Ubuntu等)。在docker中,root文件系统永远只是只读状态,并且Docker利用联合加载(Union mount)技术又会在root文件系统层上加载更多的只读文件系统。联合加载会将各层文件系统叠加到一起,这样最终的文件系统会包含所有的底层文件和目录。

Docker将这些文件系统称为镜像,一个镜像可以放到另外一个镜像的顶部,位于下面的镜像称为父镜像 parent image。最底部的镜像称为基础镜像 Base image。

当从一个镜像启动容器时,Docker会在该镜像的最顶层加载一个读写文件系统。我们想在Docker中运行的程序就是在这个读写层中执行。

61271451-A076-4E2C-A37F-5641DBB46DAE

FF5B5D4B-C3D1-4920-BA48-8F5BFE4D66CB

写时复制机制: 当Docker第一次启动一个容器时,初始的读写层是空的。当文件系统发生变化时,这些变化都会应用到这一层上。每个只读镜像层都是只读的,并且以后永远不会变化。

列出镜像

通过docker images 可以查看docker镜像。

root@firephoenix-virtual-machine:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              f49eec89601e        12 days ago         129 MB

所有的本地镜像都保存在docker 宿主机的_var_lib/docker 目录下,每个镜像都保存在Docker所采用的存储驱动目录下面。

对于我们使用的docker中的ubuntu镜像,实际上它并不是一个完整的操作系统,它只是一个裁剪版,只包含最低限度的支持系统运行的组件。

带标签的镜像

$ sudo docker run -t -i --name new_container ubuntu:14.04 /bin/bash

Docker Hub中包含两种类型的仓库:用户仓库(user repository) 和 顶层仓库( top-level repository) 。

用户仓库的镜像是由Docker用户创建的,顶层仓库是有Docker 内部团队来管理。

用户仓库的命名: 用户名_仓库名 yourwilliam_puppet

查找镜像

可以使用docker search 来查找所有的Docker Hub上公共的可用镜像

root@firephoenix-virtual-machine:/opt# docker search nginx
NAME                      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                     Official build of Nginx.                        5210      [OK]
jwilder/nginx-proxy       Automated Nginx reverse proxy for docker c...   935                  [OK]
richarvey/nginx-php-fpm   Container running Nginx + PHP-FPM capable ...   335                  [OK]
million12/nginx-php       Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS...   75                   [OK]
webdevops/php-nginx       Nginx with PHP-FPM                              69                   [OK]
maxexcloo/nginx-php       Framework container with nginx and PHP-FPM...   58                   [OK]
h3nrik/nginx-ldap         NGINX web server with LDAP/AD, SSL and pro...   34                   [OK]
bitnami/nginx             Bitnami nginx Docker Image                      22                   [OK]
evild/alpine-nginx        Minimalistic Docker image with Nginx            11                   [OK]
gists/nginx               Nginx on Alpine                                 8                    [OK]
webdevops/nginx           Nginx container                                 7                    [OK]
maxexcloo/nginx           Framework container with nginx installed.       7                    [OK]
1science/nginx            Nginx Docker images that include Consul Te...   4                    [OK]
blacklabelops/nginx       Dockerized Nginx Reverse Proxy Server.          4                    [OK]
ixbox/nginx               Nginx on Alpine Linux.                          3                    [OK]
servivum/nginx            Nginx Docker Image with Useful Tools            2                    [OK]
dock0/nginx               Arch container running nginx                    2                    [OK]
frekele/nginx             docker run --rm --name nginx -p 80:80 -p 4...   2                    [OK]
xataz/nginx               Light nginx image                               2                    [OK]
drupaldocker/nginx        NGINX for Drupal                                2                    [OK]
tozd/nginx                Dockerized nginx.                               1                    [OK]
unblibraries/nginx        Baseline non-PHP nginx container                0                    [OK]
watsco/nginx              nginx:1.11-alpine                               0                    [OK]
c4tech/nginx              Several nginx images for web applications.      0                    [OK]
funkygibbon/nginx         nginx + openssl automated build, customisa...   0                    [OK]

也可以在docker hub 网站上查找可用镜像,查找到以后可以使用docker pull 命令来拉去镜像到本地。最后使用docker run就可以执行镜像

构建镜像

docker可以使用两种方式构建镜像:

  1. 使用docker commit命令
  2. 使用docker build 命令和Dockerfile文件

推荐使用更强大的dockerfile 来构建docker镜像。

登陆docker 的 hub 平台

root@firephoenix-virtual-machine:/opt# 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: yourwilliam
Password:
Login Succeeded

commit 创建镜像

$ docker run -i -t ubuntu /bin/bash
###更新apt-get
root@90082b9a66f3:/# apt-get update
###安装nginx
root@90082b9a66f3:/# apt-get install nginx
###exit 出来后再进行commit
root@firephoenix-virtual-machine:/opt# docker commit 90082b9a66f3 yourwilliam/nginx_test

###换源 
###换下面两个源都可以
sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/cn.archive.ubuntu.com\/ubuntu\//g' /etc/apt/sources.list

sed -i 's/http:\/\/cn.archive.ubuntu.com\/ubuntu\//http:\/\/mirrors.aliyun.com\/ubuntu\//g' /etc/apt/sources.list

用Dockerfile 来构建镜像

推荐使用被称为Dockerfile的定义文件和docker build命令来构建镜像。


$ mkdir static_web
$ cd static_web
$ touch Dockerfile
$ vi Dockerfile

Dockerfile填充以下内容

# Version: 0.0.1
FROM ubuntu
MAINTAINER william "yourwilliam@gmail.com"
RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/cn.archive.ubuntu.com\/ubuntu\//g' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nginx
RUN echo 'Hi, I am in you container' \
    > /usr/share/nginx/html/index.html
EXPOSE 80

其中第一个RUN是更换ubuntu的源,国内使用archive的源会很慢

完成之后

root@firephoenix-virtual-machine:/opt/docker/static_web# docker build -t="yourwilliam/static_web" .
Sending build context to Docker daemon 2.048 kB
Step 1/7 : FROM ubuntu
 ---> f49eec89601e
Step 2/7 : MAINTAINER william "yourwilliam@gmail.com"
 ---> Using cache
 ---> 20d54ff737f4
Step 3/7 : RUN sed -i 's/http:\/\/archive.ubuntu.com\/ubuntu\//http:\/\/cn.archive.ubuntu.com\/ubuntu\//g' /etc/apt/sources.list
 ---> Using cache
 ---> 340aaa0cbe30
Step 4/7 : RUN apt-get update
 ---> Using cache
 ---> 097b144abeda
Step 5/7 : RUN apt-get install -y nginx
 ---> Running in ec5a6d6d8bb1
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  fontconfig-config fonts-dejavu-core geoip-database libexpat1 libfontconfig1
  libfreetype6 libgd3 libgeoip1 libicu55 libjbig0 libjpeg-turbo8 libjpeg8
  libpng12-0 libssl1.0.0 libtiff5 libvpx3 libx11-6 libx11-data libxau6 libxcb1
  libxdmcp6 libxml2 libxpm4 libxslt1.1 nginx-common nginx-core sgml-base ucf
  xml-core
Suggested packages:
  libgd-tools geoip-bin fcgiwrap nginx-doc ssl-cert sgml-base-doc debhelper
The following NEW packages will be installed:
  fontconfig-config fonts-dejavu-core geoip-database libexpat1 libfontconfig1
  libfreetype6 libgd3 libgeoip1 libicu55 libjbig0 libjpeg-turbo8 libjpeg8
  libpng12-0 libssl1.0.0 libtiff5 libvpx3 libx11-6 libx11-data libxau6 libxcb1
  libxdmcp6 libxml2 libxpm4 libxslt1.1 nginx nginx-common nginx-core sgml-base
  ucf xml-core
0 upgraded, 30 newly installed, 0 to remove and 6 not upgraded.
Need to get 15.5 MB of archives.
After this operation, 57.3 MB of additional disk space will be used.
Get:1 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libxau6 amd64 1:1.0.8-1 [8376 B]
Get:2 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 sgml-base all 1.26+nmu4ubuntu1 [12.5 kB]
Get:3 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libjpeg-turbo8 amd64 1.4.2-0ubuntu3 [111 kB]
Get:4 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libjbig0 amd64 2.1-3.1 [26.6 kB]
Get:5 http://cn.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libexpat1 amd64 2.1.0-7ubuntu0.16.04.2 [71.3 kB]
Get:6 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libpng12-0 amd64 1.2.54-1ubuntu1 [116 kB]
Get:7 http://cn.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libssl1.0.0 amd64 1.0.2g-1ubuntu4.6 [1082 kB]
Get:8 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 ucf all 3.0036 [52.9 kB]
Get:9 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 geoip-database all 20160408-1 [1678 kB]
Get:10 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libgeoip1 amd64 1.6.9-1 [70.1 kB]
Get:11 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libicu55 amd64 55.1-7 [7643 kB]
Get:12 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libxdmcp6 amd64 1:1.1.2-1.1 [11.0 kB]
Get:13 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libxcb1 amd64 1.11.1-1ubuntu1 [40.0 kB]
Get:14 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libx11-data all 2:1.6.3-1ubuntu2 [113 kB]
Get:15 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libx11-6 amd64 2:1.6.3-1ubuntu2 [571 kB]
Get:16 http://cn.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libxml2 amd64 2.9.3+dfsg1-1ubuntu0.1 [696 kB]
Get:17 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 xml-core all 0.13+nmu2 [23.3 kB]
Get:18 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 fonts-dejavu-core all 2.35-1 [1039 kB]
Get:19 http://cn.archive.ubuntu.com/ubuntu xenial-updates/main amd64 fontconfig-config all 2.11.94-0ubuntu1.1 [49.9 kB]
Get:20 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libfreetype6 amd64 2.6.1-0.1ubuntu2 [316 kB]
Get:21 http://cn.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libfontconfig1 amd64 2.11.94-0ubuntu1.1 [131 kB]
Get:22 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libjpeg8 amd64 8c-2ubuntu8 [2194 B]
Get:23 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libtiff5 amd64 4.0.6-1 [144 kB]
Get:24 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libvpx3 amd64 1.5.0-2ubuntu1 [732 kB]
Get:25 http://cn.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libxpm4 amd64 1:3.5.11-1ubuntu0.16.04.1 [33.8 kB]
Get:26 http://cn.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libgd3 amd64 2.1.1-4ubuntu0.16.04.5 [125 kB]
Get:27 http://cn.archive.ubuntu.com/ubuntu xenial/main amd64 libxslt1.1 amd64 1.1.28-2.1 [145 kB]
Get:28 http://cn.archive.ubuntu.com/ubuntu xenial-updates/main amd64 nginx-common all 1.10.0-0ubuntu0.16.04.4 [26.6 kB]
Get:29 http://cn.archive.ubuntu.com/ubuntu xenial-updates/main amd64 nginx-core amd64 1.10.0-0ubuntu0.16.04.4 [428 kB]
Get:30 http://cn.archive.ubuntu.com/ubuntu xenial-updates/main amd64 nginx all 1.10.0-0ubuntu0.16.04.4 [3498 B]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 15.5 MB in 32s (483 kB/s)
Selecting previously unselected package libxau6:amd64.
(Reading database ... 7256 files and directories currently installed.)
Preparing to unpack .../libxau6_1%3a1.0.8-1_amd64.deb ...
Unpacking libxau6:amd64 (1:1.0.8-1) ...
Selecting previously unselected package sgml-base.
Preparing to unpack .../sgml-base_1.26+nmu4ubuntu1_all.deb ...
Unpacking sgml-base (1.26+nmu4ubuntu1) ...
Selecting previously unselected package libjpeg-turbo8:amd64.
Preparing to unpack .../libjpeg-turbo8_1.4.2-0ubuntu3_amd64.deb ...
Unpacking libjpeg-turbo8:amd64 (1.4.2-0ubuntu3) ...
Selecting previously unselected package libjbig0:amd64.
Preparing to unpack .../libjbig0_2.1-3.1_amd64.deb ...
Unpacking libjbig0:amd64 (2.1-3.1) ...
Selecting previously unselected package libexpat1:amd64.
Preparing to unpack .../libexpat1_2.1.0-7ubuntu0.16.04.2_amd64.deb ...
Unpacking libexpat1:amd64 (2.1.0-7ubuntu0.16.04.2) ...
Selecting previously unselected package libpng12-0:amd64.
Preparing to unpack .../libpng12-0_1.2.54-1ubuntu1_amd64.deb ...
Unpacking libpng12-0:amd64 (1.2.54-1ubuntu1) ...
Selecting previously unselected package libssl1.0.0:amd64.
Preparing to unpack .../libssl1.0.0_1.0.2g-1ubuntu4.6_amd64.deb ...
Unpacking libssl1.0.0:amd64 (1.0.2g-1ubuntu4.6) ...
Selecting previously unselected package ucf.
Preparing to unpack .../archives/ucf_3.0036_all.deb ...
Moving old data out of the way
Unpacking ucf (3.0036) ...
Selecting previously unselected package geoip-database.
Preparing to unpack .../geoip-database_20160408-1_all.deb ...
Unpacking geoip-database (20160408-1) ...
Selecting previously unselected package libgeoip1:amd64.
Preparing to unpack .../libgeoip1_1.6.9-1_amd64.deb ...
Unpacking libgeoip1:amd64 (1.6.9-1) ...
Selecting previously unselected package libicu55:amd64.
Preparing to unpack .../libicu55_55.1-7_amd64.deb ...
Unpacking libicu55:amd64 (55.1-7) ...
Selecting previously unselected package libxdmcp6:amd64.
Preparing to unpack .../libxdmcp6_1%3a1.1.2-1.1_amd64.deb ...
Unpacking libxdmcp6:amd64 (1:1.1.2-1.1) ...
Selecting previously unselected package libxcb1:amd64.
Preparing to unpack .../libxcb1_1.11.1-1ubuntu1_amd64.deb ...
Unpacking libxcb1:amd64 (1.11.1-1ubuntu1) ...
Selecting previously unselected package libx11-data.
Preparing to unpack .../libx11-data_2%3a1.6.3-1ubuntu2_all.deb ...
Unpacking libx11-data (2:1.6.3-1ubuntu2) ...
Selecting previously unselected package libx11-6:amd64.
Preparing to unpack .../libx11-6_2%3a1.6.3-1ubuntu2_amd64.deb ...
Unpacking libx11-6:amd64 (2:1.6.3-1ubuntu2) ...
Selecting previously unselected package libxml2:amd64.
Preparing to unpack .../libxml2_2.9.3+dfsg1-1ubuntu0.1_amd64.deb ...
Unpacking libxml2:amd64 (2.9.3+dfsg1-1ubuntu0.1) ...
Selecting previously unselected package xml-core.
Preparing to unpack .../xml-core_0.13+nmu2_all.deb ...
Unpacking xml-core (0.13+nmu2) ...
Selecting previously unselected package fonts-dejavu-core.
Preparing to unpack .../fonts-dejavu-core_2.35-1_all.deb ...
Unpacking fonts-dejavu-core (2.35-1) ...
Selecting previously unselected package fontconfig-config.
Preparing to unpack .../fontconfig-config_2.11.94-0ubuntu1.1_all.deb ...
Unpacking fontconfig-config (2.11.94-0ubuntu1.1) ...
Selecting previously unselected package libfreetype6:amd64.
Preparing to unpack .../libfreetype6_2.6.1-0.1ubuntu2_amd64.deb ...
Unpacking libfreetype6:amd64 (2.6.1-0.1ubuntu2) ...
Selecting previously unselected package libfontconfig1:amd64.
Preparing to unpack .../libfontconfig1_2.11.94-0ubuntu1.1_amd64.deb ...
Unpacking libfontconfig1:amd64 (2.11.94-0ubuntu1.1) ...
Selecting previously unselected package libjpeg8:amd64.
Preparing to unpack .../libjpeg8_8c-2ubuntu8_amd64.deb ...
Unpacking libjpeg8:amd64 (8c-2ubuntu8) ...
Selecting previously unselected package libtiff5:amd64.
Preparing to unpack .../libtiff5_4.0.6-1_amd64.deb ...
Unpacking libtiff5:amd64 (4.0.6-1) ...
Selecting previously unselected package libvpx3:amd64.
Preparing to unpack .../libvpx3_1.5.0-2ubuntu1_amd64.deb ...
Unpacking libvpx3:amd64 (1.5.0-2ubuntu1) ...
Selecting previously unselected package libxpm4:amd64.
Preparing to unpack .../libxpm4_1%3a3.5.11-1ubuntu0.16.04.1_amd64.deb ...
Unpacking libxpm4:amd64 (1:3.5.11-1ubuntu0.16.04.1) ...
Selecting previously unselected package libgd3:amd64.
Preparing to unpack .../libgd3_2.1.1-4ubuntu0.16.04.5_amd64.deb ...
Unpacking libgd3:amd64 (2.1.1-4ubuntu0.16.04.5) ...
Selecting previously unselected package libxslt1.1:amd64.
Preparing to unpack .../libxslt1.1_1.1.28-2.1_amd64.deb ...
Unpacking libxslt1.1:amd64 (1.1.28-2.1) ...
Selecting previously unselected package nginx-common.
Preparing to unpack .../nginx-common_1.10.0-0ubuntu0.16.04.4_all.deb ...
Unpacking nginx-common (1.10.0-0ubuntu0.16.04.4) ...
Selecting previously unselected package nginx-core.
Preparing to unpack .../nginx-core_1.10.0-0ubuntu0.16.04.4_amd64.deb ...
Unpacking nginx-core (1.10.0-0ubuntu0.16.04.4) ...
Selecting previously unselected package nginx.
Preparing to unpack .../nginx_1.10.0-0ubuntu0.16.04.4_all.deb ...
Unpacking nginx (1.10.0-0ubuntu0.16.04.4) ...
Processing triggers for libc-bin (2.23-0ubuntu5) ...
Processing triggers for systemd (229-4ubuntu13) ...
Setting up libxau6:amd64 (1:1.0.8-1) ...
Setting up sgml-base (1.26+nmu4ubuntu1) ...
Setting up libjpeg-turbo8:amd64 (1.4.2-0ubuntu3) ...
Setting up libjbig0:amd64 (2.1-3.1) ...
Setting up libexpat1:amd64 (2.1.0-7ubuntu0.16.04.2) ...
Setting up libpng12-0:amd64 (1.2.54-1ubuntu1) ...
Setting up libssl1.0.0:amd64 (1.0.2g-1ubuntu4.6) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 /usr/local/share/perl/5.22.1 /usr/lib/x86_64-linux-gnu/perl5/5.22 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base .) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)
debconf: falling back to frontend: Teletype
Setting up ucf (3.0036) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 /usr/local/share/perl/5.22.1 /usr/lib/x86_64-linux-gnu/perl5/5.22 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base .) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)
debconf: falling back to frontend: Teletype
Setting up geoip-database (20160408-1) ...
Setting up libgeoip1:amd64 (1.6.9-1) ...
Setting up libicu55:amd64 (55.1-7) ...
Setting up libxdmcp6:amd64 (1:1.1.2-1.1) ...
Setting up libxcb1:amd64 (1.11.1-1ubuntu1) ...
Setting up libx11-data (2:1.6.3-1ubuntu2) ...

▽
Setting up libx11-6:amd64 (2:1.6.3-1ubuntu2) ...
Setting up libxml2:amd64 (2.9.3+dfsg1-1ubuntu0.1) ...
Setting up xml-core (0.13+nmu2) ...
Setting up fonts-dejavu-core (2.35-1) ...
Setting up fontconfig-config (2.11.94-0ubuntu1.1) ...
Setting up libfreetype6:amd64 (2.6.1-0.1ubuntu2) ...
Setting up libfontconfig1:amd64 (2.11.94-0ubuntu1.1) ...
Setting up libjpeg8:amd64 (8c-2ubuntu8) ...
Setting up libtiff5:amd64 (4.0.6-1) ...
Setting up libvpx3:amd64 (1.5.0-2ubuntu1) ...
Setting up libxpm4:amd64 (1:3.5.11-1ubuntu0.16.04.1) ...
Setting up libgd3:amd64 (2.1.1-4ubuntu0.16.04.5) ...
Setting up libxslt1.1:amd64 (1.1.28-2.1) ...
Setting up nginx-common (1.10.0-0ubuntu0.16.04.4) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (Can't locate Term/ReadLine.pm in @INC (you may need to install the Term::ReadLine module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.22.1 /usr/local/share/perl/5.22.1 /usr/lib/x86_64-linux-gnu/perl5/5.22 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.22 /usr/share/perl/5.22 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base .) at /usr/share/perl5/Debconf/FrontEnd/Readline.pm line 7.)
debconf: falling back to frontend: Teletype
Setting up nginx-core (1.10.0-0ubuntu0.16.04.4) ...
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up nginx (1.10.0-0ubuntu0.16.04.4) ...
Processing triggers for libc-bin (2.23-0ubuntu5) ...
Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
Processing triggers for systemd (229-4ubuntu13) ...
 ---> 48a67b1a5bff
Removing intermediate container ec5a6d6d8bb1
Step 6/7 : RUN echo 'Hi, I am in you container'     > /usr/share/nginx/html/index.html
 ---> Running in 417ec79c0fd4
 ---> 95b11de0f9d5
Removing intermediate container 417ec79c0fd4
Step 7/7 : EXPOSE 80
 ---> Running in cd5c887ff495
 ---> 3250588d0ab5
Removing intermediate container cd5c887ff495
Successfully built 3250588d0ab5

代表镜像创建成功

几种镜像创建方式:

###默认的镜像创建方式
root@firephoenix-virtual-machine:/opt/docker/static_web# docker build -t="yourwilliam/static_web" .

### 带标签的镜像创建方式
root@firephoenix-virtual-machine:/opt/docker/static_web# docker build -t="yourwilliam/static_web:v1" .

###从git仓库创建Docker镜像
root@firephoenix-virtual-machine:/opt/docker/static_web# docker build -t="yourwilliam/static_web:v1" git@github.com:yourwilliam/docker-static_web

如果构建上下文的根目录下存在.dockerignore 命名的文件的话,那么该文件会被按行进行分割,每一行都是一条文件过滤匹配模式。

查看镜像

其中可以看到第一行为创建的镜像,之前的失败的镜像也在里面

root@firephoenix-virtual-machine:/opt/docker/static_web# docker images
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
yourwilliam/static_web   latest              3250588d0ab5        13 minutes ago      226 MB
<none>                   <none>              718100872482        17 minutes ago      129 MB
yourwilliam/nginx_test   latest              0d0093feafc1        About an hour ago   226 MB
ubuntu                   latest              f49eec89601e        12 days ago         129 MB

使用docker history命令可以深入探究镜像是如何创建出来的

root@firephoenix-virtual-machine:/opt/docker/static_web# docker history 3250588d0ab5
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
3250588d0ab5        18 minutes ago      /bin/sh -c #(nop)  EXPOSE 80/tcp                0 B
95b11de0f9d5        18 minutes ago      /bin/sh -c echo 'Hi, I am in you container...   26 B
48a67b1a5bff        18 minutes ago      /bin/sh -c apt-get install -y nginx             56.8 MB
097b144abeda        20 minutes ago      /bin/sh -c apt-get update                       39.7 MB
340aaa0cbe30        21 minutes ago      /bin/sh -c sed -i 's/http:\/\/archive.ubun...   1.94 kB
20d54ff737f4        39 minutes ago      /bin/sh -c #(nop)  MAINTAINER william "you...   0 B
f49eec89601e        12 days ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0 B
<missing>           12 days ago         /bin/sh -c mkdir -p /run/systemd && echo '...   7 B
<missing>           12 days ago         /bin/sh -c sed -i 's/^#\s*\(deb.*universe\...   1.9 kB
<missing>           12 days ago         /bin/sh -c rm -rf /var/lib/apt/lists/*          0 B
<missing>           12 days ago         /bin/sh -c set -xe   && echo '#!/bin/sh' >...   745 B
<missing>           12 days ago         /bin/sh -c #(nop) ADD file:68f83d996c38a09...   129 MB

从其中可以看到每一步是如何创建出来镜像的

从新镜像启动容器

使用docker run来启动镜像

root@firephoenix-virtual-machine:/opt/docker/static_web# docker run -d -p 80 --name static_web yourwilliam/static_web nginx -g "daemon off;"
ab42b43c74ea4217516d695399554228f07c18ceb046707591a994d742fbd00b
root@firephoenix-virtual-machine:/opt/docker/static_web# docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                         PORTS                   NAMES
ab42b43c74ea        yourwilliam/static_web   "nginx -g 'daemon ..."   13 seconds ago      Up 13 seconds                  0.0.0.0:32768->80/tcp   static_web
90082b9a66f3        ubuntu                   "/bin/bash"              About an hour ago   Exited (0) About an hour ago                           sleepy_northcutt

使用 -d命令告知docker以分离的方式在后台运行,指定需要在容器中运行的命令 nginx -g “daemon off;” 这将以前台运行的方式启动Nginx,来作为我们的Web服务器。

-p命令用来控制Docker在运行时应该公开哪些网络端口给外部主机。可以通过docker ps -a 来查看端口的分配情况。

也可以使用命令查看容器的端口和ip的绑定

root@firephoenix-virtual-machine:/opt/docker/static_web# docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                         PORTS                   NAMES
ab42b43c74ea        yourwilliam/static_web   "nginx -g 'daemon ..."   6 minutes ago       Up 6 minutes                   0.0.0.0:32768->80/tcp   static_web
90082b9a66f3        ubuntu                   "/bin/bash"              About an hour ago   Exited (0) About an hour ago                           sleepy_northcutt
root@firephoenix-virtual-machine:/opt/docker/static_web# docker port ab42b43c74ea
80/tcp -> 0.0.0.0:32768

也可以指定端口

docker run -d -p 80:80 --name static_web yourwilliam/static_web nginx -g "daemon off;"

##或者

docker run -d -p 8080:80 --name static_web yourwilliam/static_web nginx -g "daemon off;"

##或者带ip

docker run -d -p 127.0.0.1:80:80 --name static_web yourwilliam/static_web nginx -g "daemon off;"

##也可以指定ip的随机端口

docker run -d -p 127.0.0.1::80 --name static_web yourwilliam/static_web nginx -g "daemon off;"

##还可以制定-P 参数来对外公开在Dockerfile 中EXPOSE指令中设置的所有端口

docker run -d -P --name static_web yourwilliam/static_web nginx -g "daemon off;"

也可以在端口绑定时使用/udp后缀来制定UDP端口。

配置完成后访问该网站就可以看到自己修改的信息了。

Dockerfile 指令

CMD指令

CMD制定用于指定一个容器启动时要运行的命令。类似于 docker run -i -t ubuntu /bin/bash 里面最后的/bin/bash

CMD格式:

CMD [“/bin/true”]

CMD [“/bin/bash”, “-l”]

要运行的命令是放在一个数组结构中的,docker推荐一直使用以数组语法来设置要执行的命令

docker run 命令可以覆盖CMD 指令。

在Dockerfire中只能指定一条CMD指令,如果指定了多条CMD指令,也只有最后一条CMD指令会被使用。如果想在启动容器时运行多个进程或者多条命令,可以考虑使用类似supervisor这样的服务管理工具。

ENTRYPOINT

ENTRYPOINT指令提供的命令不容器在启动容器时被覆盖,docker run命令中指定的任何参数都会被当做参数再次传递给ENTRYPOINT指令中指定的命令。

ENTRYPOINT ["/usr/sbin/nginx"]

ENTRYPOINT ["/usr/sbin/nginx", "-g", "deamon off"]
WORKDIR

WORKDIR指令用于在从镜像创建一个新容器时,在容器内部设置一个工作目录,ENTRYPOINT和/或CMD指定的程序会在这个目录下执行

可以使用WORKDIR为Dockerfile中后续的一系列指令设置工作目录,也可以为最终的容器设置工作目录。

WORKDIR /opt/webapp/db
RUN bundle install
WORKDIR /opt/webapp
ENTRYPOINT [ “rackup” ]

也可以通过-w 来覆盖工作目录

$ sudo docker run -ti -w /var/log ubuntu pwd
/var/log
ENV

ENV 指令用来在镜像构建过程中设置环境变量,这个新环境变量可以和后续的任何RUN指令中使用。

ENV RVM_PATH /home/run

使用 RUN gem install unicorn的时候等同于使用了命令 RVM_PATH=/home/rvm gem install unicorn

也可以在其他指令中使用这些环境变量

ENV TARGET_DIR _opt_app
WORKDIR $TARGET_DIR

同时这些环境变量也会被持久保存到我们的镜像创建的任何容器中

在docker run命令中可以是哦用-e 来传递环境变量

USER

USER指令用于制定该镜像会用什么样的用户去运行

USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group

也可以在docker run命令中通过-u选项来覆盖该指令指定的值。

如果不通过USER指令指定用户,默认用户为root。

VOLUME

VOLUME指令用来向基于镜像创建的容器添加卷。一个卷是一个可以存在一个或者多个容器内的特定目录,这个目录可以绕过联合文件系统,并提供共享数据或者对数据进行持久化的功能。

卷功能让我们可以将数据(如源代码)、数据库或者其他内容添加到镜像中而不是将这些内容提交到镜像中。并且允许我们在多个容器间共享这些内容。

VOLUME ["/opt/project"]

VOLUME ["/opt/projetc","/data"]

这条指令将会为基于此镜像创建的任何容器创建一个名为_opt_project的挂载点
也可以通过数组的方式指定多个卷

ADD

ADD指令用来将构建环境下的文件和目录复制到镜像中

ADD software.lic /opt/application/software.lic

将构建目录下面的software.lic文件和目录复制到镜像中。

Docker通过目的地址参数末尾的字符来判断文件源是目录还是文件。

如果目标地址以/结尾,那么Docker认为源位置指向的是一个目录。

如果目的地址以/课文吗。那么Docker认为源位置指向的是一个目录。

如果目的地址不以/结尾,那么Docker认为源位置指向的是文件

如果将一个归档文件(gzip、bzip2、xz)指定为源文件时,Docker会自动将归档文件解开

如果目标位置不存在的话,Docker会为我们创建这个全路径,新创建文件模式为0755,UID和GID都为0

ADD文件会使得构建缓存变得无效,如果通过ADD指令想镜像添加一个文件或目录,那么这将使Dockerfile中的后续指令都不能继续使用之前的构建缓存。

CORY

COPY只关心在构建上下文中复制本地文件,不会去做文件提取和解压的工作。

ONBUILD

ONBUILD 指令能为镜像添加触发器(trigger),当一个镜像被用做其他镜像的基础镜像时,该镜像中的触发器将会被执行。

触发器会在构建过程中插入 新指令,我们可以认为这些指令是紧跟在FROM之后指定的。

ONBUILD ADD . /app/src
ONBUILD RUN cd /app/src && make

ONBUILD触发器会按照在父镜像中指定的顺序执行,并且只能被继承一次。也就是做只能存在于子镜像中执行,而不会在孙子镜像中执行。

将镜像推送到docker hub

docker push yourwilliam/static_web