容器迁移
将容器的文件系统打包成tar文件,也就是把正在运行的容器直接导出为tar包的镜像文件
export
Export a container's filesystem as a tar archive
有两种方式(elated_lovelace为容器名):
第一种:
[root@master ~]# docker export -o elated_lovelace.tar elated_lovelace
第二种:
[root@master ~]# docker export 容器名称 > 镜像.tar
导入镜像归档文件到其他宿主机:
import
Import the contents from a tarball to create a filesystem image
# docker import elated_lovelace.tar elated_lovelace:v1
镜像迁移
保存一台宿主机上的镜像为tar文件,然后可以导入到其他的宿主机上:
save
Save an image(s) to a tar archive
将镜像打包,与下面的load命令相对应
#docker save -o nginx.tar nginx
load
Load an image from a tar archive or STDIN
与上面的save命令相对应,将上面sava命令打包的镜像通过load命令导入
#docker load < nginx.tar
容器的迁移
docker export b25f3cb2bf1f | gzip > mynginx123.tar
zcat mynginx123.tar | docker import - mynginx123
dockerfile构建镜像
通过Dockerfile创建镜像
虽然可以自己制作 rootfs(见'容器文件系统那些事儿'),但Docker 提供了一种更便捷的方式,叫作 Dockerfile
docker build命令用于根据给定的Dockerfile和上下文以构建Docker镜像。
docker build语法:
# docker build [OPTIONS] <PATH | URL | ->
- 常用选项说明
--build-arg,设置构建时的变量
--no-cache,默认false。设置该选项,将不使用Build Cache构建镜像
--pull,默认false。设置该选项,总是尝试pull镜像的最新版本
--compress,默认false。设置该选项,将使用gzip压缩构建的上下文
--disable-content-trust,默认true。设置该选项,将对镜像进行验证
--file, -f,Dockerfile的完整路径,默认值为‘PATH/Dockerfile’
--isolation,默认--isolation="default",即Linux命名空间;其他还有process或hyperv
--label,为生成的镜像设置metadata
--squash,默认false。设置该选项,将新构建出的多个层压缩为一个新层,但是将无法在多个镜像之间共享新层;设置该选项,实际上是创建了新image,同时保留原有image。
--tag, -t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag
--network,默认default。设置该选项,Set the networking mode for the RUN instructions during build
--quiet, -q ,默认false。设置该选项,Suppress the build output and print image ID on success
--force-rm,默认false。设置该选项,总是删除掉中间环节的容器
--rm,默认--rm=true,即整个构建过程成功后删除中间环节的容器
- PATH | URL | -说明:
给出命令执行的上下文。
上下文可以是构建执行所在的本地路径,也可以是远程URL,如Git库、tarball或文本文件等。
如果是Git库,如https://github.com/docker/rootfs.git#container:docker,则隐含先执行git clone --depth 1 --recursive,到本地临时目录;然后再将该临时目录发送给构建进程。
构建镜像的进程中,可以通过ADD命令将上下文中的任何文件(注意文件必须在上下文中)加入到镜像中。
-表示通过STDIN给出Dockerfile或上下文。
示例:
docker build - < Dockerfile
说明:该构建过程只有Dockerfile,没有上下文
docker build - < context.tar.gz
说明:其中Dockerfile位于context.tar.gz的根路径
docker build -t champagne/bbauto:latest -t champagne/bbauto:v2.1 .
docker build -f dockerfiles/Dockerfile.debug -t myapp_debug .
2.1、 创建镜像所在的文件夹和Dockerfile文件
命令:
1、mkdir sinatra
2、cd sinatra
3、touch Dockerfile
2.2、 在Dockerfile文件中写入指令,每一条指令都会更新镜像的信息例如:
# This is a comment
FROM ubuntu:14.04
MAINTAINER tiger tiger@localhost.localdomain
RUN apt-get update && apt-get install -y ruby ruby-dev
RUN gem install sinatra
格式说明:
每行命令都是以 INSTRUCTION statement 形式,就是命令+ 清单的模式。命令要大写,"#"是注解。
FROM 命令是告诉docker 我们的镜像什么。
MAINTAINER 是描述 镜像的创建人。
RUN 命令是在镜像内部执行。就是说他后面的命令应该是针对镜像可以运行的命令。
2.3、创建镜像
命令:docker build -t tiger/sinatra:v2 .
docker build 是docker创建镜像的命令
-t 是标识新建的镜像属于 ouruser的
sinatra是仓库的名称
:v2 是tag
"."是用来指明 我们的使用的Dockerfile文件当前目录的
详细执行过程:
[root@master sinatra]# docker build -t tiger/sinatra:v2 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM daocloud.io/ubuntu:14.04
Trying to pull repository daocloud.io/ubuntu ...
14.04: Pulling from daocloud.io/ubuntu
f3ead5e8856b: Pull complete
Digest: sha256:ea2b82924b078d9c8b5d3f0db585297a5cd5b9c2f7b60258cdbf9d3b9181d828
---> 2ff3b426bbaa
Step 2 : MAINTAINER tiger tiger@localhost.localdomain
---> Running in 948396c9edaa
---> 227da301bad8
Removing intermediate container 948396c9edaa
Step 3 : RUN apt-get update && apt-get install -y ruby ruby-dev
...
Step 4 : RUN gem install sinatra
---> Running in 89234cb493d9
2.4、创建完成后,从镜像创建容器
#docker run -t -i tiger/sinatra:v2 /bin/bash
Dockerfile分为四个部分: 基础镜像信息、维护者信息、镜像操作指令和容器启动指令。 即FROM、MAINTAINER、RUN、CMD四个部分
指令说明
FROM 指定所创建镜像的基础镜像
MAINTAINER 制定维护者信息
RUN 运行命令
CMD 容器启动是默认执行的命令
LABEL 指定生成镜像的元数据标签信息
EXPOSE 声明镜像内服务所监听的端口
ENV 指定环境变量
ADD 复制指定src路径的内容到容器的dest路径下,如果src为tar文件,则自动解压到dest路径下
copy 复制指定src路径的内容到镜像的dest路径下
ENTERPOINT 指定镜像的默认入口
VOLUME 创建数据卷挂载点
USER 指定运行容器是的用户名或UID
WORKDIR 配置工作目录
ARG 指定镜像内使用的参数
ONBUILD 配置当所创建的镜像作为其他镜像的基础镜像时,所执行创建操作指令
STOPSIGAL 容器退出信号值
HEALTHCHECK 如何进行健康检查
SHELL 指定使用shell的默认shell类型
nginx-dockerfile示例
FROM centos:7.2.1511
ENV TZ=Asia/Shanghai
RUN yum -y install epel* \
yum -y install gcc openssl openssl-devel pcre-devel zlib-devel
ADD nginx-1.14.0.tar.gz /opt/
WORKDIR /opt/nginx-1.14.0
RUN ./configure --prefix=/opt/nginx --http-log-path=/opt/nginx/logs/access.log --error-log-path=/opt/nginx/logs/error.log --http-client-body-temp-path=/opt/nginx/client/ --http-proxy-temp-path=/opt/nginx/proxy/ --with-http_stub_status_module --with-file-aio --with-http_flv_module --with-http_gzip_static_module --with-stream --with-threads --user=www --group=www
RUN make && make install
RUN groupadd www && useradd -g www www
WORKDIR /opt/nginx
RUN rm -rf /opt/nginx-1.14.0
ENV NGINX_HOME=/opt/nginx
ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/nginx/sbin
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
tomcat-dockerfile示例
FROM centos:7.4.1708
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-7.0.88.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_171 jdk && mv apache-tomcat-7.0.88 tomcat
ENV JAVA_HOME=/usr/local/jdk
ENV CLASS_PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CATALINA_HOME /usr/local/tomcat
EXPOSE 8080
CMD /usr/local/tomcat/bin/catalina.sh run
在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着 Container 的结束而结束),需要将数据从宿主机挂载到容器中。
目前Docker提供了三种不同的方式将数据从宿主机挂载到容器中:
(1)volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(**最常用的方式**)
(2) bind mounts:意为着可以存储在宿主机系统的任意位置;(**比较常用的方式**)
(3) tmpfs:挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(**一般都不会用的方式**)
使用端口转发解决容器端口访问问题
使用-P
docker run --name mysql1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123 daocloud.io/library/mysql:5.7