如何安装容器引擎?
容器引擎几乎支持在所有操作系统上安装,用户可以根据需要选择要安装的容器引擎版本。
说明
容器镜像服务支持使用容器引擎1.11.2 及以上版本上传镜像。
安装容器引擎需要连接互联网,内网服务器需要绑定弹性IP后才能访问。
另外,在Linux 操作系统下,可以使用如下命令快速安装容器引擎。
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
如何制作容器镜像?
自行制作容器镜像,主要有两种方法:
- 制作快照方式获得镜像(偶尔制作的镜像):在基础镜像上(比如Ubuntu),先登录镜像系统并安装容器引擎软件,然后整体制作快照。
- Dockerfile方式构建镜像(经常更新的镜像):将软件安装的流程写成Dockerfile,使用docker build构建成容器镜像。
方法一:制作快照方式获得镜像
如果后续镜像没有变化,可采用方法一制作镜像。
具体操作如下:
- 找一台主机,安装容器引擎软件。
- 启动一个空白的基础容器,并进入容器。
例如:启动一个CentOS的容器。
docker run -it centos
- 执行安装任务。
yum install XXX
git clone https://github.com/lh3/bwa.git
cd bwa;make
说明请预先安装好Git,并检查本机是否有ssh key设置。
- 输入exit退出容器。
- 制作快照。
docker commit -m "xx" -a "test" container-id test/image:tag
-a:提交的镜像作者。
container-id:步骤2中的容器id。可以使用docker ps -a查询得到容器id。
-m:提交时的说明文字。
test/image:tag:仓库名/镜像名:TAG名。
- 执行docker images可以查看到制作完成的容器镜像。
方法二:使用Dockerfile方式构建
如果后续镜像经常变更(例如某个软件更新版本),则需要采用方法二制作镜像。若仍采用方法一制作镜像,则每次变更都需要重新执行方法一的命令,操作过程比较繁琐,所以建议使用自动化制作镜像的方法。
其实就是将方法一制作镜像的方法,用文件方式写出来(文件名为Dockerfile)。然后执行: docker build -t test/image:tag. 命令(命令中“.”表示Dockerfile文件的路径),自动完成镜像制作。
简单的Dockerfile示例:
说明如果依赖外部网络,请搭建网络环境,并保证网络可用。
#Version 1.0.1
FROM centos:latest
#设置root用户为后续命令的执行者
USER root
#执行操作
RUN yum update -y
RUN yum install -y java
#使用&&拼接命令
RUN touch test.txt && echo "abc" >>abc.txt
#对外暴露端口
EXPOSE 80 8080 1038
#添加网络文件
ADD https://www.baidu.com/img/bd_logo1.png /opt/
#设置环境变量
ENV WEBAPP_PORT=9090
#设置工作目录
WORKDIR /opt/
#设置启动命令
ENTRYPOINT ["ls"]
#设置启动参数
CMD ["-a", "-l"]
#设置卷
VOLUME ["/data", "/var/www"]
#设置子镜像的触发操作
ONBUILD ADD . /app/src
ONBUILD RUN echo "on build excuted" >> onbuild.txt
Dockerfile基本语法
- FROM:
指定待扩展的父级镜像(基础镜像)。除注释之外,文件开头必须是一个FROM指令,后面的指令便在这个父级镜像的环境中运行,直到遇到下一个FROM指令。通过添加多个FROM命令,可以在同一个Dockerfile文件中创建多个镜像。
- MAINTAINER:
声明创建镜像的作者信息:用户名、邮箱,非必须参数。
- RUN:
修改镜像的命令,常用来安装库、安装程序以及配置程序。一条RUN指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来的指令会在新的镜像上继续执行。RUN 语句有两种形式:
RUN yum update :在**/bin/sh**路径中执行的指令。
RUN ["yum", "update"] :直接使用系统调用exec来执行。
RUN yum update && yum install nginx :使用&&符号将多条命令连接在同一条RUN语句中。
- EXPOSE:
指明容器内进程对外开放的端口,多个端口之间使用空格隔开。
运行容器时,通过设置参数 -P (大写)即可将EXPOSE里所指定的端口映射到主机上其他的随机端口,其他容器或主机可以通过映射后的端口与此容器通信。
您也可以通过设置参数 -p (小写)将Dockerfile中EXPOSE中没有列出的端口设置成公开。
- ADD:
向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件,也可以是一个文件夹。
第一个参数:源文件(夹)。
如果是相对路径,必须是相对于Dockerfile所在目录的相对路径。
如果是URL,会将文件先下载下来,然后再添加到镜像里。
第二个参数:目标路径。
如果源文件是主机上的zip或者tar形式的压缩文件,容器引擎会先解压缩,然后将文件添加到镜像的指定位置。
n 如果源文件是一个通过URL指定的网络压缩文件,则不会解压。
- VOLUME:
在镜像里创建一个指定路径(文件或文件夹)的挂载点,这个容器可以来自主机或者其它容器。多个容器可以通过同一个挂载点共享数据,即便其中一个容器已经停止,挂载点也仍可以访问。
- WORKDIR:
为接下来执行的指令指定一个新的工作目录,这个目录可以是绝对目录,也可以是相对目录。根据需要,WORKDIR可以被多次指定。当启动一个容器时,最后一条WORKDIR指令所指的目录将作为容器运行的当前工作目录。
- ENV:
设置容器运行的环境变量。在运行容器的时候,通过设置**-e**参数可以修改这个环境变量值,也可以添加新的环境变量。
例如:
docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.example.com ...
- CMD:
用来设置启动容器时默认运行的命令。
- ENTRYPOINT:
用来指定容器启动时的默认运行的命令。区别在于:运行容器时添加在镜像之后的参数,对ENTRYPOINT是拼接,CMD是覆盖。
若在Dockerfile中指定了容器启动时的默认运行命令为 ls -l ,则运行容器时默认启动命令为 ls -l ,例如:
ENTRYPOINT [ "ls", "-l"] :指定容器启动时的程序及参数为 ls -l 。
docker run centos :当运行centos容器时,默认执行的命令是docker run centos ls -l
docker run centos -a :当运行centos容器时拼接了-a参数,则默认运行的命令是docker run centos ls -l -a
若在Dockerfile中指定了容器启动时的默认运行命令为 --entrypoint ,则在运行容器时如果需要替换默认运行命令,可以通过添加**--entrypoint**参数来替换Dockerfile中的指定。例如:
docker run gutianlangyu/test --entrypoint echo "hello world"
- USER:
为容器的运行及RUN、CMD、ENTRYPOINT等指令的运行指定用户或UID。
- ONBUILD:
触发器指令。构建镜像时,容器引擎的镜像构建器会将所有的ONBUILD指令指定的命令保存到镜像的元数据中,这些命令在当前镜像的构建过程中并不会执行。只有新的镜像使用FROM指令指定父镜像为当前镜像时,才会触发执行。
使用FROM以这个Dockerfile构建出的镜像为父镜像,构建子镜像时:
ONBUILD ADD . /app/src :自动执行ADD . /app/src
如何制作镜像压缩包?
使用docker save命令可将容器镜像制作成tar或tar.gz文件压缩包,具体命令格式如下:
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS说明:--output、-o,表示导出到文件。
示例:
$ docker save nginx:latest > nginx.tar
$ ls -sh nginx.tar
108M nginx.tar
$ docker save php:5-apache > php.tar.gz
$ ls -sh php.tar.gz
372M php.tar.gz
$ docker save --output nginx.tar nginx
$ ls -sh nginx.tar
108M nginx.tar
$ docker save -o nginx-all.tar nginx
$ docker save -o nginx-latest.tar nginx:latest
docker push使用什么协议将镜像推动到SWR?
HTTPS协议。
同名称同tag的镜像上传后会覆盖之前的镜像吗?
会覆盖,保留最新上传的镜像。
SWR单个layer的最大限制是多少?
使用客户端向SWR上传镜像,镜像的每个layer大小不能超过10G。
为什么通过客户端上传和页面上传的镜像大小不一样?
问题描述
假设在本地Docker客户端上制作了一个nginx镜像,版本号为v2.0.0,使用docker images命令查询SIZE为 22.8MB :
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2.0.0 22f2bf2e2b4f 9 days ago 22.8MB
- 通过客户端(即执行docker push命令)上传该镜像至SWR镜像仓库,查询大小为 9.5MB 。
- 在本地Docker客户端将镜像打包为tar格式,将nginx.tar下载至本地后,通过页面方式上传至SWR镜像仓库,查询大小为 23.2MB 。
可以发现,通过客户端和页面上传的镜像大小不一样。
原因分析
使用客户端上传的镜像每一层layer都进行了tgz压缩,而页面上传的镜像包是经过docker打包的,每一层layer只进行了打包,没有压缩。所以两种方式上传的镜像大小显示会不一致。
是否支持跨区域同步镜像?
目前不支持跨区域同步镜像。
如果您想把最新推送的镜像同步到其他区域镜像仓库内,您可以先将镜像下载到本地,然后上传到需要同步区域的镜像仓库中。
SWR支持ARM镜像上传吗?
SWR镜像仓库对镜像的内核架构是没有任何限制的,您上传ARM架构的镜像和上传x86的镜像是没有区别的,直接上传即可。
如何通过API上传镜像到SWR?
SWR暂时没有开放镜像上传的API,您可以使用docker push或页面方式上传镜像。
如何通过API下载镜像?
SWR暂不支持通过API下载镜像。如果要下载镜像,请通过docker pull命令来进行下载操作。
docker pull下载的镜像存放在什么地方?
docker pull将镜像下载到本地节点上,您可以通过docker save命令将镜像保存成tar归档文件。
是否支持跨区域下载镜像?
支持。
SWR当前支持跨区域公网下载,请确保下载机可访问公网且获取正确的仓库登录指令。例如:您想下载“广州4”区域的镜像,则需要获取“广州4”区域的镜像仓库登录指令。
控制台页面的镜像可以下载到本地吗?
控制台页面的镜像不能直接下载至本地,您可以参考以下方法操作:
- 在镜像详情页获取镜像的下载指令。
- 在安装了Docker客户端的机器上执行上一步的指令下载镜像。
示例:
docker pull registry.cn-jssz 1 .ctyun .cn ** /group/nginx:v1**
- 将镜像保存为.tar或.tar.gz格式的文件。
示例:
docker save nginx:v1 > nginx.tar
下载文件至本地。