之前都是在拉取已经构建好了的带有定制内容的镜像,如果需要修改自己的镜像,并且需要更新和管理这些镜像,构建镜像的方法如下。
(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
docker commit 只是提交的容器镜像与容器的当前状态有差异的部分,所以就显得更新非常轻量。
也可以在提交时指定更多的数据(包括标签)来详细描述所做的修改。
docker commit -m"a new custom image" -a"James Turnabull" 34fe jyh/apache2:webserver
-m t指定新创建的镜像的提交信息,-a用来列出该镜像的作者信息,最后为该镜像增加了一个webserver的标签。
从提交的镜像中创建一个新容器
docker run -it jyh/apache2:webserver /bin/bash
验证里面确实包括apache
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
从新镜像里面启动容器
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之间比较大的端口上。
查看docker的映射情况
docker ps -l
上图所示,容器中的80端口被映射到了宿主机的49154端口上
查看容器的端口映射情况如下。
docker port f04c 80
指定将容器中的端口映射到docker宿主机的某一特定端口上。
docker run -d -p 8081:8080 --name static_web5 jyh/static_web nginx -g "daemon off;"
将容器中的8080端口映射到宿主机的8081端口上。
使用-P参数可以用来对外公开在Dockerfile中通过EXPOSE指令公开的所有端口。
docker run -d -P --name static_web2 jyh/static_web nginx -g "daemon off;"
使用curl 连接到容器
curl localhost:49154