Docker commit手动构建镜像
在使用docker的过程中,除了利用官方已经做好的镜像之外,很多时候还需要根据实际的需求定制自己的镜像。docker镜像的制作主要有两种方式:
1)通过docker commit制作镜像,运行一个基础镜像,然后在基础镜像上进行软件的安装和配置文件的修改。然后提交变动到新的镜像。
2)通过docker build制作镜像,按顺序执行dockerfile中命令,然后生成一个新的镜像。
下面通过docker commit的方式手动构建一个nginx的镜像。
1.运行基础镜像centos,启动一个容器。
[root@kvm-server01 ~]# docker run --name zmznginx -i -t centos
2.在基础镜像上面添加阿里云的epel源。
[root@0643287ce0e0 /]# rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm Retrieving https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm warning: /var/tmp/rpm-tmp.VRQdN4: Header V3 RSA/SHA256 Signature, key ID 352c64e5: NOKEY Preparing... ################################# [100%] Updating / installing... 1:epel-release-7-9 ################################# [100%]
3.在容器上面面安nginx服务。
[root@0643287ce0e0 /]# yum install -y nginx [root@0643287ce0e0 /]# exit
4.获取该容器的ID。
[root@kvm-server01 ~]# docker ps -a |grep zmznginx 0643287ce0e0 centos "/bin/bash" 9 minutes ago Exited (0) 28 seconds ago zmznginx
5.使用docker commit 命令创建镜像。
#构建docker镜像帮助命令 [root@kvm-server01 ~]# docker commit --help #创建镜像提交信息、创建镜像作者、容器的ID、仓库名、镜像名和TAG。 [root@kvm-server01 ~]# docker commit -m "zmzblog nginx" --author='sfzhang' e306c978cccc zmz/zmznginx:v1 sha256:f36f429763a9aaf6b90e22bc78003cfbe1131961951dd64cb43cd5f4750e4920
6.查看刚才创建的镜像。
[root@kvm-server01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE zmz/zmznginx v1 f36f429763a9 About a minute ago 354.1 MB docker.io/centos latest 98d35105a391 6 days ago 192.5 MB hub.c.163.com/library/nginx latest db079554b4d2 4 weeks ago 181.8 MB
7.让容器的nginx已非守护进程的方运行。
[root@kvm-server01 ~]# docker run -i -t --name nginx01 "zmz/zmznginx:v1" [root@9c92767d77dd /]# mkdir -p /data/logs [root@9c92767d77dd /]# chown -R www.www /data/logs [root@9c92767d77dd /]# vi /etc/nginx/nginx.conf #是否以守护进程的方式运行nginx,守护进程是指脱离终端并且在后台运行的进程,默认是on. daemon off; user www www; worker_processes 8; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; error_log /data/logs/nginx_error.log crit; pid /data/logs/nginx.pid; worker_rlimit_nofile 51200; events { use epoll; worker_connections 51200; multi_accept on; } http { include mime.types; default_type application/octet-stream; #charse gb2312; server_names_hash_bucket_size 128; client_header_buffer_size 16k; large_client_header_buffers 4 256k; server_tokens off; sendfile on; tcp_nopush off; tcp_nodelay on; keepalive_timeout 60; client_header_timeout 30; client_body_timeout 30; send_timeout 30; client_max_body_size 30M; client_body_buffer_size 1024k; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 16 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; gzip on; gzip_min_length 1000; gzip_buffers 4 16k; #gzip_http_version 1.0; gzip_comp_level 9; gzip_types text/plain text/javascript application/x-javascript text/css application/xml text/xml application/xml+rss; gzip_vary on; fastcgi_intercept_errors on; #指定Nginx日志输出的格式,main为此日志输出的格式的名称 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$request_time"'; #error_page 500 502 503 504 /50x.html; error_page 402 403 502 503 504 /error; server { listen 80 default; server_name _; return 403; } include vhosts/*.conf; } [root@9c92767d77dd /]# exit
8.再次使用docker commit 命令创建镜像,这里的tag为v2。
[root@kvm-server01 ~]# docker commit -m "zmzblog nginx" --author='sfzhang' 9c92767d77dd zmz/zmznginx:v2 sha256:9ab2e63e4246247c906c7ca35dbcc7415e2f3945d184b19acad1008a9f5a0c38
9.查看dock镜像。
[root@kvm-server01 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE zmz/zmznginx v2 9ab2e63e4246 22 seconds ago 354.1 MB #nginx以非守护进程的方式运行 zmz/zmznginx v1 f36f429763a9 11 minutes ago 354.1 MB #nginx以daemon守护进程的方式运行 docker.io/centos latest 98d35105a391 6 days ago 192.5 MB hub.c.163.com/library/nginx latest db079554b4d2 4 weeks ago 181.8 MB
10.启动容器,通过-p参数表示指定端口的映射。。
[root@kvm-server01 ~]# docker run --name zmzblognginx -d -p 8080:80 zmz/zmznginx:v2 nginx #-d参数表示容器运行放在后台模式 a11fe42cfed2e827261036adf5714a52f7df87b99bbb3c5b52b50af4ed063829
11.查看容器是否运行。
[root@kvm-server01 ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c56515b7548c zmz/zmznginx:v2 "nginx" 18 seconds ago Up 16 seconds 0.0.0.0:8080->80/tcp zmzblognginx
12.测试容器运行是否正常。
[root@kvm-server01 ~]# curl -I http://192.168.100.100:8080 HTTP/1.1 200 OK Server: nginx/1.10.2
备注:命令中有docker run命令的都是启动一个Docker容器,命令中有docker commit命令的都是构建一个docker镜像。