Docker Image 的制作两种方法
方法 1:docker commit #保存 container 的当前状态到 image 后,然后生成对应的 image
方法 2:docker build #使用 Dockerfile 文件自动化制作 image
一、. 语法: docker commit <container 的 ID>或<image_name>
根据容器当前状态做一个 image 镜像:创建一个安装了 apache 工具的 centos 镜像
[root@146 ~]# docker run -it docker.io/centos:latest /bin/bash
[root@1d3563200047 /]# yum -y install httpd #在 container 中安装 apache 软件包
[root@1d3563200047 /]# exit
[root@146~]# docker commit 1d3563200047 docker.io/centos:apache (:apache 为打包的标签)
二.通过:docker build 创建一个基于 centos 的 httpd web 服务器镜像。
使用 docker build 创建镜像时,需要使用 Dockerfile 文件自动化制作 image 镜像
注:Dockerfile 有点像源码编译时./configure 后产生的 Makefile
以下操作要在 docker 物理机上操作:
2.1、创建工作目录
[root@146 ~]# mkdir /docker-build
[root@146 ~]# cd /docker-build
[root@146 docker-build]# touch Dockerfile
注: make 自动化编译时需要 Makefile 文件,自动化创建 docker 镜像时,需要 Dockerfile
2.2、编辑 Dockerfile 创建工作目录
[root@146 ~]# mkdir /docker-build
[root@146 ~]# cd /docker-build
[root@146 docker-build]# touch Dockerfile 注: make 自动化编译时需要 Makefile 文件,自动化创建 docker 镜像时,需要 Dockerfile Dockerfile 用来创建一个自定义的 image,包含了用户指定的软件依赖等。
[root@146 docker-build]# vim Dockerfile
FROM docker.io/centos:latest
MAINTAINER <cs@name.cn>
RUN yum -y install httpd
ADD start.sh /usr/local/bin/start.sh
ADD index.html /var/www/html/index.html
CMD /usr/local/bin/start.sh
注释:
FROM docker.io/centos:latest # FROM 基于哪个镜像
MAINTAINER <mk@xuegod.cn> # MAINTAINER 镜像创建者
RUN yum -y install httpd #RUN 安装软件用
ADD start.sh /usr/local/bin/start.sh
ADD index.html /var/www/html/index.html
CMD /usr/local/bin/start.sh
# ADD 将文件<src>拷贝到新产生的镜像的文件系统对应的路径<dest>。所有拷贝到新镜像中的
文件和文件夹权限为 0755,uid 和 gid 为 0
CMD echo hello world #container 启动时执行的命令或启动服务,但是一个 Dockerfile 中叧
能有一条 CMD 命令,多条则叧执行最后一条 CMD.
2. 3、创建 start.sh 脚本启动 httpd 服务和 apache 默认首页 index.html 文件
[root@146docker-build]# echo "/usr/sbin/httpd -DFOREGROUND" > start.sh
[root@146 docker-build]# chmod a+x start.sh
创建 index.html
[root@146 docker-build]# echo "docker image build test" > index.html
2.4、使用命令 build 来创建新的 image
语法:docker build -t 父镜像名:镜像的 tag Dockerfile 文件所在路径-t :表示 tage,镜像名
docker build -t docker.io/centos:httpd ./
2.5 Docker Image 的发布
方法 1:Save Image To TarBall
方法 2:Push Image To Docker Hub
方法 1:Save Image To TarBall 保存 Image 到 tar 包
语法:docker save -o 导出的镜像名.tar 本地镜像名:镜像标签
docker save -o docker.io-centos-httpd-image.tar odcker.io/centos:httpd
[root@146 ~]# docker rmi docker.io/centos:httpd #删除镜像,这里写自己镜像的 ID或名字
[root@146 ~]# docker images #发现在镜像已经被删除
[root@146 docker-build]# docker load -i
方法 2:Push Image To Docker Hub 发布到外网
1、Signup on docker hub & create repo 注册一个帐号 https://hub.docker.com/
2、Login to docker hub
# docker login -u userabc -p abc123 -e userab@gmail.com
3、Push image to docker hub #上传镜像
# docker push centos:httpd
4、Pull image from docker hub #下载镜像
# docker pull userabc/centos:httpd # 用户名/镜像名
Container 容器端口映射
启动 container
docker run -d -p 80:80 docker.io/centos:httpd
注: -p 物理机的 80 端口:容器实例的 80 端口 ,把容器中的 80 端口映射到物理机上的 80 端口
在物理机上查看容易状态:
[root@146 ~]# docker ps
访问正在运行的 container 容器实例
语法: docker exec -it <container id | name> /bin/bash
配置容器 root 密码:
[root@a9c3a7bf2054 /]# echo 123456 | passwd --stdin root
在容器中安装 sshd 服务,然后把 22 端口映射出去,就可以远程登弽容器了。
[root@localhost ~]# docker run -it docker.io/centos:latest /bin/bash #启动一个实例
[root@local ~]# docker logs b93795788ee0#容器的 ID 可以写全,只要唯一就可以了 #查看日志
列出所有运行中容器 docker ps docker ps -a #-a 列出所有容器(包含沉睡/退出状态的容器);
杀死一个容器。 比如:杀死一个正在后台运行的容器
docker kill b93795788ee0 #杀死一个容器
docker rm -f b93795788ee0 # -f 强制删除