docker学习
以下操作基于Centos 7.6系统
一、docker安装
yum install -y docker
二、配置docker不需要sudo
如果还没有 docker group 就添加一个:
sudo groupadd docker
将用户加入该 group 内。然后退出并重新登录就生效啦。
sudo gpasswd -a ${USER} docker
重启 docker 服务
sudo service docker restart
切换当前会话到新 group 或者重启 X 会话
newgrp - docker
三、配置官方的中国加速镜像
修改 /etc/docker/daemon.json,加上如下的键值:
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
重启docker服务
sudo service docker restart
四、Dockerfile基础命令
FROM:指定基础镜像
第一条指令。scratch是虚拟的镜像,表示一个空白的镜像。
示例:
FROM centos:7
ENV:设置环境变量
在其他指令中可以直接引用ENV设置的环境变量。
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
示例:
ENV TZ=Asia/Shanghai LANG=zh_CN.UTF-8
RUN:执行命令
shell 格式: RUN <命令> ,RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
exec 格式: RUN ["可执行文件", "参数1", "参数2"] 。run可以写多个,每一个指令都会建立一层中间镜像
COPY:复制文本
COPY <源路径>... <目标路径>
COPY ["<源路径1>",... "<目标路径>"]
<源路径> 可以是多个、以及使用通配符,通配符规则满足Go的filepath.Match 规则,如:COPY hom* /mydir/ COPY hom?.txt /mydir/
<目标路径>使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。
ADD:高级复制文件
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
<源路径> 可以是一个 URL ,下载后的文件权限自动设置为 600 。
CMD:容器启动命令
shell 格式: CMD <命令>
exec 格式: CMD ["可执行文件", "参数1", "参数2"...]
ENTRYPOINT:入口点
同CMD,指定容器启动程序及参数。
通过--entrypoint 参数在运行时替换。
用例一:使用CMD要在运行时重新写命令才能追加运行参数,ENTRYPOINT则可以运行时接受新参数。
示例:
FROM ubuntu:16.04
RUN apt-get update \
&& apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
ARG:构建参数
与ENV不同的是,容器运行时不会存在这些环境变量。
可以用 docker build --build-arg <参数名>=<值> 来覆盖。
VOLUME:定义匿名卷
VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>
EXPOSE:暴露端口
EXPOSE <端口1> [<端口2>...]
EXPOSE :EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
WORKDIR:指定工作目录
WORKDIR <工作目录路径>
RUN cd /app
RUN echo "hello" > world.txt
两次run不在一个环境内,可以使用WORKDIR。
USER:指定当前用户
这个用户必须是事先建立好的,否则无法切换。
USER <用户名>
HEALTHCHECK:健康检查
最后,通过Dockerfile创建镜像(最后的 . 表示指定镜像构建过程中的上下文环境的目录,并不是指定当前目录下的Dockerfile创建镜像)
docker build -t <REPOSITORY_NAME>:<TAG> .
示例:
docker build -t mongo:3.2 .