- 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中运行的程序就是在这个读写层中执行。
写时复制机制: 当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可以使用两种方式构建镜像:
- 使用docker commit命令
- 使用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