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镜像。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *