Docker入门笔记
本文最后更新于:2022年10月17日 下午
Docker入门笔记
我入门Docker的笔记,基本都是网上各路搜集来的资料,包含了Docker的解释、安装和使用。
什么是Docker
Docker是一种实现容器化的技术,在一个OS上运行的多个容器能够共享资源,从而增加资源使用率,并大幅提升启动速度(相较于虚拟机)。使用Docker还能将应用程序和运行软硬件环境分离开,从而实现应用程序的快速交付,不需要太多关心程序运行的环境配置,即“build once, run everywhere”。
Docker的架构如下图,是一种C/S架构。首先需要编写一个Dockerfile,在使用docker build
命令对其进行编译之后,就能得到Image(镜像)。Dockerfile包含了构建镜像的信息,比如基于的是什么系统/镜像、要安装哪些程序、要包含哪些文件、要运行什么命令等等,而docker build
就相当于编译,而Image就是编译出来的“可执行”的文件。
在有了Image之后,通过docker run
就能将其加载到内存中运行,执行之后就成为了一个container。
为了不重复造轮子,可以将自己编译的Image上传到Registry中分享给其他人,官方有公共的Docker Hub。使用docker pull
就能从Registry上下载镜像了,同时也能使用docker push
将自己的Image上传。
在Ubuntu安装Docker
下面的安装过程基本就是copy官方教程,安装过程需要sudo
1 |
|
卸载Docker
1 |
|
无root权限用户运行docker
1 |
|
假如运行提示了以下信息,则是因为~/.docker/
目录在之前通过sudo权限创建了,可以删除这个目录(会丢失已有的配置)或者改变这个目录的权限。
1 |
|
安装之后验证
1 |
|
Dockerfile格式
Dockerfile中,注释用#
,命令是一些单词的大写, 分行可以用\
。
-
FROM
Dockerfile的第一个命令必须是
FROM
命令,设置基础镜像 -
RUN
在当前镜像上新建一个层并执行命令(于
docker build
阶段),有两种模式:1
2RUN <command>
RUN ["executable", "param1", "param2"]由于每一个RUN都会新建一个层,所以可以通过
&&
连接命令来避免创建过多的层。 -
CMD
启动容器时(
docker run
)执行的命令,只能有一条,有三种模式:1
2
3CMD ["executable","param1","param2"]
CMD ["param1","param2"] # 用这种方式需要指定`ENTRYPOINT
CMD command param1 param2 -
ENTRYPOINT
和CMD一样是在启动容器时运行,有两种格式:
1
2ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2假如提供了CMD,那执行时会变成
<ENTRYPOINT> <CMD>
-
LABEL
给镜像添加一些元信息,比如开发日期、维护者信息、版本等,采用键值对的形式:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
-
EXPOSE
指定运行时监听的端口和协议,可以暴露多个端口,默认TCP
EXPOSE <port>/<protocol>
但是这个也能在
docker run
中使用-p
参数覆盖:docker run -p 80:80/tcp -p 80:80/udp ...
-
ENV
设置环境变量,也可以在
docker run
中使用--env
参数覆盖,可以用来设置数据库密码等1
2
3
4
5
6# dockerfile中
ENV MY_NAME="John Doe"
ENV MY_DOG=Rex\ The\ Dog
ENV MY_CAT=fluffy
# 命令行覆盖
docker run --env <key>=<value> -
ADD
将文件添加进镜像中,有两种格式,src可以是远程URL的资源或者本地的资源:
1
2ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]1
2
3
4# 不安装git来添加一个github库
# syntax=docker/dockerfile-upstream:master-labs
FROM alpine
ADD --keep-git-dir=true https://github.com/moby/buildkit.git#v0.10.1 /buildkit -
COPY
和ADD一样,但是只能添加本地资源。
-
VOLUME
挂载一个数据目录,可能是数据库的本地保存目录,以免容器重启而丢失或者容器变得很大。默认会保存在
/var/lib/docker/volumes/{ID}
下命令格式为:
VOLUME ["/data"]
。在运行容器时,也有
-v
参数来挂载数据目录:1
2# 将容器中/soft目录挂载到主机的/test下,容器中对/soft的写入会写在主机的/test下。
docker run -v /test:/soft -
USER
设置用户名和用户组,格式
USER <user>[:<group>]
-
WORKDIR
设置工作目录,类似cd命令,格式
WORKDIR /path/to/workdir
-
ARG
声明一些变量,在build期间通过
--build-arg <varname>=<value>
来设置值,不建议通过这种方式传递秘钥,因为能通过docker history
查看。格式:
ARG <name>[=<default value>]
可以参考微信云托管的flask框架的Dockerfile:wxcloudrun-flask/Dockerfile at main · WeixinCloud/wxcloudrun-flask (github.com)
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!