之前都是在拉取已经构建好了的带有定制内容的镜像,如果需要修改自己的镜像,并且需要更新和管理这些镜像,构建镜像的方法如下。
(1)docker commit 命令
(2)docker build命令和douckerfile文件
不推荐使用第一种,第二种的方法更灵活、更强大。
一般来说,我们不是真正的构建新镜像,而是基于一个已有的基础镜像,如ubuntu等,从而构建新镜像。当然也有从零构建一个全新的镜像的方法。

1 创建docker hub 账号

构建镜像需要共享和发布镜像,需要将镜像推送到docker hub或者用户自己私有的registy中。
登陆

docker login

2 commit提交镜像

创建要定制的ubunut容器并进入修改,apt安装apache。
commit提交并查看

docker commit 34fe jyh/apache2
docker images jyh/apache2

Windows构建docker镜像 docker 构建镜像_docker


docker commit 只是提交的容器镜像与容器的当前状态有差异的部分,所以就显得更新非常轻量。

也可以在提交时指定更多的数据(包括标签)来详细描述所做的修改。

docker commit -m"a new custom image" -a"James Turnabull" 34fe jyh/apache2:webserver

-m t指定新创建的镜像的提交信息,-a用来列出该镜像的作者信息,最后为该镜像增加了一个webserver的标签。

Windows构建docker镜像 docker 构建镜像_运维_02


从提交的镜像中创建一个新容器

docker run -it jyh/apache2:webserver /bin/bash

验证里面确实包括apache

Windows构建docker镜像 docker 构建镜像_Dockerfile_03

3 Dockerfile构建镜像

在空目录下创建Dockerfile文件

mkdir static_web
cd static_web/
touch Dockerfile
vim Dockerfile

Dockerfile 文件内容如下。

#Version:0.0.1
FROM ubuntu:14.04
MAINTAINER James Turnbull "1967760537@qq.com"
RUN apt-get update && apt install -y nginx
RUN echo 'Hi,I am in your container' \
		>/usr/share/nginx/html/index.html
EXPOSE 80

使用Dockerfile构建新镜像

docker build -t="jyh/static_web" .

-t 为新镜像设置了仓库和名称,也可以在后面使用:+标签 为新镜像添加标签。
. 表示docker构建需要到本地目录中找Dockerfile文件,也也可指定git仓库的源地址来指定Dockerfile的位置。
如:git@github.com:xxx/xxxx

Windows构建docker镜像 docker 构建镜像_Windows构建docker镜像_04


从新镜像里面启动容器

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

-d docker以分离式的方式在后台运行,比较适合类似nginx守护进程这样的需要长时间运行的进程。

nginx -g “daemon off;” 为需要在容器中运行的命令

-p 是用来控制docker在运行时应该公开哪些网络端口给外部宿主机。

-p是用来指定容器的端口映射到宿主机的端口上!宿主机会随机选择一个位于32768-610000之间比较大的端口上。

Windows构建docker镜像 docker 构建镜像_Dockerfile_05

查看docker的映射情况

docker  ps -l

Windows构建docker镜像 docker 构建镜像_运维_06

上图所示,容器中的80端口被映射到了宿主机的49154端口上

查看容器的端口映射情况如下。

docker  port f04c 80

Windows构建docker镜像 docker 构建镜像_Dockerfile_07


指定将容器中的端口映射到docker宿主机的某一特定端口上。

docker run -d -p 8081:8080 --name static_web5 jyh/static_web nginx -g "daemon off;"

将容器中的8080端口映射到宿主机的8081端口上。

Windows构建docker镜像 docker 构建镜像_容器_08

使用-P参数可以用来对外公开在Dockerfile中通过EXPOSE指令公开的所有端口。

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

使用curl 连接到容器

curl localhost:49154

Windows构建docker镜像 docker 构建镜像_Dockerfile_09