Docker虚拟化镜像制作

版权声明:欢迎转载,转载请注明出处! https://blog.csdn.net/miss1181248983/article/details/88718517

一个完整的Docker镜像可以支撑一个Docker容器的运行,在Docker容器运行过程中主要提供文件系统数据支撑。Docker镜像时分层结构的,是由多个层级组成,每个层级分别存储各种软件实现某个功能。

Docker镜像作为Docker中最基本的概念,有以下特性:

1. 镜像是分层的,每个镜像都是由一个或多个镜像层组成,可通过在某个镜像加上一定的镜像层来得到新镜像;

2. 每个镜像层拥有唯一镜像ID,Docker引擎默认通过镜像ID来识别镜像;

3. 镜像在存储和使用时,共享相同的镜像层,在PULL镜像时,已有的镜像层会自动跳过下载;

4. 每个镜像层都只读,即使启动层容器,也无法进行真正的修改,修改只会作用于最上层的容器层。

作为运维人员,我们可以制作内部的Docker镜像,Docker镜像方法有两种:

基于原始文件和目录从0开始制作镜像

基于Docker官网仓库镜像制作叠加镜像
  • docker及docker-compose命令自动补全:
# source /usr/share/bash-completion/completions/docker

# source /usr/share/bash-completion/completions/docker-compose

# yum install -y bash-completion

# source /usr/share/bash-completion/bash_completion

基于原始文件和目录从0开始制作镜像

  1. 基于CentOS Linux干净系统(初始化安装完成),将整个系统打包成tar文件即可:
# cd /root

# tar --numeric-owner --exclude=/proc --exclude=/sys -cvf centos7-base.tar /

# ls
anaconda-ks.cfg  centos7-base.tar
  1. 将制作完成的基础镜像拷贝到远程服务器,并且导入至Docker images列表中:
# cat centos7-base.tar | docker import - centos7
sha256:d25481af31ead8067dc11f2b949767ddbe82d50ecbd26a753b9a454d9656f64c

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             latest              d25481af31ea        19 seconds ago      1.43GB
  1. 基于导入的CentOS镜像启动CentOS容器:
# docker run -itd centos7:latest /bin/bash
de2579408a3e43838b2dbb8f98847f1b69407a7e344b136efc0b1149f4d71934

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
de2579408a3e

# docker exec -it de cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core) 

# docker exec -it de ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 16  bytes 1296 (1.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

根据上面的方法,我们可以制作各种企业应用软件和程序镜像,并且将镜像方便的迁移至各个平台。


基于Docker官网仓库镜像制作叠加镜像

完全从0开始制作基础镜像通常比较繁琐、复杂,在生产环境下,可以基于Docker官网提供的各种基础镜像模板来制作镜像,这样可以节省时间、人力成本等。

基于Docker官网仓库镜像制作新镜像主要有三种方式:

Docker commit方式

Docker export方式

Dockerfile方式
  1. Docker commit方式:

基于基础镜像,通过Docker run启动新的容器,exec或者远程进入新容器,根据企业中的需求,部署相关的软件、修改相应的配置,然后将整个容器系统commit提交成一个全新的镜像。

# docker exec -it de bash

[root@de2579408a3e /]# passwd root

[root@de2579408a3e /]# mkdir /data

[root@de2579408a3e /]# wget -P /data/ http://nginx.org/download/nginx-1.14.2.tar.gz

[root@de2579408a3e /]# exit

# docker commit de centos7:v1
sha256:556dd5d8972969c0e54d1d5733b2bc9cca4ced1de974377011b79c04ab618433

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             v1                  556dd5d89729        4 seconds ago       1.43GB
centos7             latest              d25481af31ea        25 minutes ago      1.43GB

新生成的容器中有新建的/data目录,目录下有nginx的tar包。

  1. Docker export方式:

基于基础镜像,通过Docker run启动新的容器,exec或者远程进入新容器,根据企业中的需求,部署相关的软件、修改相应的配置,然后将整个容器系统export导出成一个全新的镜像文件,然后可以该镜像文件拷贝到其它主机上,再import导入成镜像。

# docker export de -o centos7-v2.tar

# ls
anaconda-ks.cfg  centos7-base.tar  centos7-v2.tar

# docker import centos7-v2.tar centos7:v2
sha256:f4fddd805f795d4b0a6f08df7cc05f5a59eaac09d36e141f7b510a706b7c9856

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             v2                  f4fddd805f79        16 seconds ago      1.43GB
centos7             v1                  556dd5d89729        7 minutes ago       1.43GB
centos7             latest              d25481af31ea        32 minutes ago      1.43GB

上面两种方法,只有docker export制作的镜像默认可以拷贝到其它的平台,docker commit制作的镜像只在images列表中,而不是一个tar文件,如何将images列表中的镜像导出呢?

# docker save centos7:v1 -o centos7-v1.tar

# ls
anaconda-ks.cfg  centos7-base.tar  centos7-v1.tar  centos7-v2.tar

# docker load -i centos7-v1.tar
Loaded image: centos7:v1
  1. Dockerfile方式:

企业生产环境中,推荐使用Dockerfile制作镜像,Docker制作原理是基于一个基础镜像,通过编写Dockerfile文件的方式,将各个功能进行叠加,最终形成新的Docker镜像,是目前互联网企业中打包镜像最为推荐的方式。

Dockerfile 是一个镜像的表示,也是一个镜像的原材料,可以通过Dockerfile来描述构建镜像,并自动构建一个容器。

下面是Dockerfile制作镜像的指令和参数:

FROM     指定基于哪个基础镜像

MAINTAINER     指定作者信息

RUN     镜像操作指令

CMD     指定容器启动时执行的命令,只能有一条,写多条也只有最后一条生效

EXPOSE     指定镜像内服务监听的端口

ENV     为后续的RUN指令提供一个环境变量

ADD     将本地的一个文件或目录拷贝到容器的某个目录里

COPY     将本地的一个文件或目录拷贝到容器的某个目录里,推荐使用COPY而不是ADD

ENTRYPOINT     指定容器启动时执行的命令,只能有一条,写多条也只有最后一条生效

VOLUME     创建一个可以从本机或者其他容器挂载的挂载点

USER     指定运行容器的用户或UID

WORKDIR     为后续的RUN、CMD或者ENTERPOINT指定工作目录

ARG     指定镜像内使用的参数(如版本号信息等)

ONBUILD     配置当前所创建的镜像作为其它镜像的基础镜像时,所执行的创建操作的命令

STOPSIGNAL     容器退出的信号

HEALTHCHECK     如何进行健康检查

SHELL     指定使用shell时的默认shell类型

ENTRYPOINT和CMD的区别在于ENTRYPOINT可以使用CMD作为参数,通常都是用来启动后台服务。

  • 编写Dockerfile:
# cat nginx.conf

user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;

events
{
    use epoll;
    worker_connections 6000;
}

http
{
    include mime.types;
    default_type application/octet-stream;
    server_names_hash_bucket_size 3526;
    server_names_hash_max_size 4096;
    log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
    '$host "$request_uri" $status'
    '"$http_referer" "$http_user_agent"';
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 30;
    client_header_timeout 3m;
    client_body_timeout 3m;
    send_timeout 3m;
    connection_pool_size 256;
    client_header_buffer_size 1k;
    large_client_header_buffers 8 4k;
    request_pool_size 4k;
    output_buffers 4 32k;
    postpone_output 1460;
    client_max_body_size 10m;
    client_body_buffer_size 256k;
    client_body_temp_path /usr/local/nginx/client_body_temp;
    proxy_temp_path /usr/local/nginx/proxy_temp;
    fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
    fastcgi_intercept_errors on;
    tcp_nodelay on;
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 8k;
    gzip_comp_level 5;
    gzip_http_version 1.1;
    gzip_types text/plain application/x-javascript text/css text/htm application/xml;

server
{
    listen 80;
    server_name localhost;
    index index.html index.htm index.php;
    root /usr/local/nginx/html;

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
    }

}

}
# vim Dockerfile
## Set the base image to CentOS
FROM centos7:latest
# File Auther / Maintainer
Maintainer lzx [email protected]
# Install necessary tools
RUN rpm --rebuilddb && \
	yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel && \
	yum clean all && \
    rm -rf /var/cache/yum/*
# Install Nginx
ADD http://nginx.org/download/nginx-1.8.0.tar.gz .
RUN	tar zxf nginx-1.8.0.tar.gz && \
	mkdir -p /usr/local/nginx  && \
	cd nginx-1.8.0 && \
	./configure --prefix=/usr/local/nginx && \
	make && make install && \
	rm -fv /usr/local/nginx/conf/nginx.conf
COPY nginx.conf /usr/local/nginx/conf/nginx.conf
# Expose ports
EXPOSE 80
# Set the default command to execute when creating a new container
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd           #加上tail -f防止容器启动完nginx就自动停止
  • 构建新镜像:
# docker build -t centos7:nginx .
Successfully built e20207cefc88
Successfully tagged centos7:nginx

# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos7             nginx               e20207cefc88        4 minutes ago       1.68GB
centos7             v2                  f4fddd805f79        About an hour ago   1.43GB
centos7             v1                  556dd5d89729        About an hour ago   1.43GB
centos7             latest              d25481af31ea        About an hour ago   1.43GB
  • 运行新镜像:
# docker run -itd -p 80:80 centos7:nginx bash
38b1e0876f834b78f2f8223449c2cca42fa4ab87d047b2dc5b7831a247cab871

# curl 127.0.0.1:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

访问本地80端口,可以访问到nginx欢迎页,说明容器内nginx服务已经启动并监听80端口。


猜你喜欢

转载自blog.csdn.net/miss1181248983/article/details/88718517