最近在把服务器上的应用尽量docker化,踩了不少坑……不过也正好学习docker
和docker-compose
的用法。此篇文章记录docker常用命令、使用方法,用于备忘。
配置文件
主要是dockerfile
和docker-compose.yml
两个文件,这俩的关系,简单的讲:
dockerfile
包含生成镜像的配置信息,其中的指令作用的对象是镜像。docker-compose.yml
包含启动容器的配置信息,其中指令作用的对象是容器。
镜像一般只生成一次,而容器则可以启动多个。
Dockerfile
用于生成docker镜像的配置文件,简单讲就是初始化镜像用的,比如拷贝文件到镜像、执行命令、暴露端口、设置用户等等。
生成镜像的常用命令如下:
1 | docker build -t name:tag PATH |
docker build [OPTIONS] PATH | URL | -
通过
-t
指定镜像名/版本
PATH
为Dockerfile所在的目录
格式
一个Dockerfile
大致长这个亚子:
1 | FROM ubuntu |
基本的书写格式就是:指令+操作
使用
Dockerfile
生成镜像,就是对原始镜像逐步执行Dockerfile
中指令
指令
指令不多,列张表格好了:
指令 | 操作(例子) | 功能 |
---|---|---|
FROM | FROM ubuntu:16.04 |
指定初始镜像 |
WORKDIR | WORKDIR /home/taqini |
切换工作目录 |
USER | USER taqini |
切换默认用户 |
ARG | ARG CODE_VERSION=latest |
定义变量 |
ENV | ENV DALAO=Imagin |
定义环境变量 |
COPY | COPY test /opt/test/ |
拷贝文件至镜像 |
RUN | adduser taqini |
执行系统命令 |
EXPOSE | EXPOSE 80/tcp |
曝露端口 |
CMD | CMD ["start.sh"] |
启动时执行命令 |
ENTERPOINT | ENTRYPOINT ["entrypoint.sh"] |
指定启动时的入口点 |
FROM
指定初始镜像( Base Image ),写法有三种
1 | FROM <image> [AS <name>] |
一般直接FROM image:tag
就行
WORKDIR
相当于cd
,用于切换工作目录,例如:
1 | WORKDIR /dir |
最后一个
WORKDIR
指定的路径将作为docker启动的默认路径
USER
切换到指定用户,一般指定用户名或是uid
:
1 | USER taqini |
默认用户是root
ARG
用于定义临时变量,例如:
1 | ARG CODE_VERSION=latest |
ENV
设置环境变量,有两种格式:
1 | ENV <key> <value> |
使用等于号可以同时设置多个环境变量
COPY
从本地复制文件到镜像,格式为COPY 本地文件 目标镜像文件
1 | COPY test relativeDir/ # adds "test" to `WORKDIR`/relativeDir/ |
拷贝时可以使用相对路径,前提是已经通过
WORKDIR
指定了工作目录
COPY的同时修改文件所有者:
1 | COPY --chown=user:group files* /somedir/ |
RUN
RUN就是执行系统命令,有两种格式:
RUN <command>
(shell 格式)RUN ["executable", "param1", "param2"]
(exec 格式)
shell格式相当于把
RUN
后的command
依次作为/bin/sh -c
的参数(子命令)exec格式则是直接执行括号中的命令
exec 格式使用的是
JSON
数组,所以只能用双引号,不能用单引号!
一般使用第一种,例子:
1 | RUN apt-get update |
执行命令的默认用户是root
第二种格式很麻烦,因为它不会调用shell,所以环境变量什么的就不会起作用,比如:
1 | RUN [ "echo", "$HOME" ] |
上面的用法是错的,正确的用法应该是:
1 | RUN [ "sh", "-c", "echo $HOME" ] |
很麻烦是叭 _(:з」∠)
EXPOSE
配置曝露的端口
1 | EXPOSE <port> [<port>/<protocol>...] |
例如:
1 | EXPOSE 80/tcp |
曝露的端口用于在docker启动时作端口映射,比如将docker的
80
端口映射到服务器的8080
端口:shell
1 docker run -p 80:80/tcp ...
CMD
有三种写法:
CMD ["executable","param1","param2"]
(exec 格式)CMD ["param1","param2"]
(用作ENTRYPOINT的参数)CMD command param1 param2
(shell 格式)
CMD指定的命令/脚本会在镜像启动时执行,是可执行容器默认的执行命令。
一个Dockerfile中只能有一个CMD指令,如果存在多个,则只有最后一个生效
ENTRYPOINT
镜像启动后的入口点。
和CMD不同,ENTRYPOINT先执行。
比如ENTRYPOINT指定了一个启动脚本:
1 | ENTRYPOINT ["entrypoint.sh"] |
在镜像启动后,只会执行这个脚本的内容(即使Dockerfile
中有CMD指令)。
但是CMD指令也是有用处的,比如这样:
1 | CMD ["2333"] |
运行镜像的结果是:
1 | 2333 |
也就是说,如果之前有CMD指令,CMD指令的操作数其实是用作ENTRYPOINT的参数的。
如果不指定ENTRYPOINT,CMD的操作数就会被全部用作ENTRYPOINT的参数
所以看起来的效果就是默认执行了CMD
感觉没说明白……文章末尾有参考文章,讲的十分清楚(´•灬•‘)
LABLE
给镜像添加标签(没啥用)
1 | LABEL version="1.0" |
ADD
和COPY
差不多,但貌似只能在Linux下用,不提了。
VOLUME
用于创建镜像内的挂载点,例如:
1 | VOLUME ["/data"] |
感觉没啥用,一般操作是在
docker-compose
里直接设置挂载点的信息
这篇先写到这里,docker-compose
的用法下一篇写。