一、安装docker

https://docs.docker.com/engine/install/ubuntu/

卸载旧版本

apt-get remove docker docker-engine docker.io containerd runc

安装依赖包

sudo apt-get update $ sudo apt-get install \    apt-transport-https \    ca-certificates \    curl \    gnupg \    lsb-release

添加key

 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

添加源

echo \  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装最新版本

apt-get install docker-ce docker-ce-cli containerd.io

或安装指定版本

apt-cache madison docker-ce

apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

查看docker服务

systemctl status docker

二、Dockerfile

什么是dockerfile?

Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。

docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。

例:

docker build -f /path/to/a/Dockerfile

 

结构

DockerFile分为四部分组成:基础镜像信、维护者信息、镜像操作指令和容器启动时执行指令。例如:

 

#第一行必须指令基于的基础镜像

From ubutu

 

#维护者信息

MAINTAINER docker_user  docker_user@mail.com

 

#镜像的操作指令

apt/sourcelist.list

 

RUN apt-get update && apt-get install -y ngnix

RUN echo "\ndaemon off;">>/etc/ngnix/nignix.conf

 

#容器启动时执行指令

CMD /usr/sbin/ngnix

 

指令介绍

Dockerfile 有以下指令选项:

FROM

MAINTAINER

RUN

CMD

EXPOSE

ENV

ADD

COPY

ENTRYPOINT

VOLUME

USER

WORKDIR

ONBUILD

1、FROM

用法:  FROM <image>

或者   FROM: <image>

  1. FROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。

b .FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。

  1. FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像。
  2. 如果FROM语句没有指定镜像标签,则默认使用latest标签。

2、MAINTAINER

用法:  MAINTAINER <name>

指定维护者的信息

3、 RUN

格式为Run 或者Run [“executable” ,”Param1”, “param2”]

每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的RUN都在之前RUN提交后的镜像为基础,镜像是分层的,可以通过一个镜像的任何一个历史提交点来创建,类似源码的版本控制。

exec 方式会被解析为一个 JSON 数组,所以必须使用双引号而不是单引号。exec 方式不会调用一个命令 shell,所以也就不会继承相应的变量,如:

RUN [ "echo", "$HOME" ]

这种方式是不会达到输出 HOME 变量的,正确的方式应该是这样的

RUN [ "sh", "-c", "echo", "$HOME" ]

RUN产生的缓存在下一次构建的时候是不会失效的,会被重用,可以使用--no-cache选项,即docker build --no-cache,如此便不会缓存。

4、CMD

支持三种格式:

CMD [“executable” ,”Param1”, “param2”]使用exec执行,推荐

CMD command param1 param2,在/bin/sh上执行

CMD [“Param1”, “param2”] 提供给ENTRYPOINT做默认参数。

每个容器只能执行一条CMD命令,多个CMD命令时,只最后一条被执行。

5、EXPOSE

EXPOSE <port> [<port>...]

告诉 Docker 服务端容器对外映射的本地端口,需要在 docker run 的时候使用-p或者-P选项生效。

6、 ENV

ENV <key> <value>       # 只能设置一个变量

ENV <key>=<value> ...   # 允许一次设置多个变量

指定一个环节变量,会被后续RUN指令使用,并在容器运行时保留。

例子:

ENV myName="John Doe" myDog=Rex\ The\ Dog \

    myCat=fluffy

等同于

ENV myName John Doe

ENV myDog Rex The Dog

ENV myCat fluffy

7、ADD

ADD <src>... <dest>

该命令将复制指定的 到容器中的 。 其中 可以是Dockerfile所在目录的一个相对路径;也可以是一个URL;还可以是一个tar文件(自动解压为目录)。

8、COPY

COPY <src>... <dest>

复制本地主机的 (为Dockerfile所在目录的相对路径)到容器中的 。

当使用本地目录为源目录时,推荐使用 COPY 。

9、ENTRYPOINT

ENTRYPOINT "executable", "param1", "param2"

ENTRYPOINT command param1 param2 (shell form)

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖,而CMD是可以被覆盖的。如果需要覆盖,则可以使用docker run --entrypoint选项。

每个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效。

10、VOLUME

VOLUME ["/data"]

创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。

11、USER

USER daemon

指定运行容器时的用户名或 UID,后续的RUN、CMD、ENTRYPOINT也会使用指定用户。

12、WORKDIR

WORKDIR /path/to/workdir

为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。

WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

最终路径是/a/b/c。

WORKDIR指令可以在ENV设置变量之后调用环境变量:

ENV DIRPATH /path

WORKDIR $DIRPATH/$DIRNAME

最终路径则为 /path/$DIRNAME。

13、 ONBUILD

ONBUILD [INSTRUCTION]

配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。

例如,Dockerfile 使用如下的内容创建了镜像 image-A:

[...]

ONBUILD ADD . /app/src

ONBUILD RUN /usr/local/bin/python-build --dir /app/src

[...]

如果基于 image-A 创建新的镜像时,新的 Dockerfile 中使用 FROM image-A 指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令。

# Automatically run the following

ADD . /app/src

RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild。

创建镜像

通过Docker Build 创建镜像。

# V 1.0 # Base images 基础镜像 FROM centos:7.9.2009 #MAINTAINER 维护者信息 MAINTAINER ruyi #ENV 设置环境变量 ENV PATH /usr/local/nginx/sbin:$PATH #ADD  文件放在当前目录下,拷过去会自动解压 ADD nginx-1.20.1.tar.gz /usr/local/ #RUN 执行以下命令 RUN yum install epel-release -y RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all RUN useradd -s /sbin/nologin -M www #WORKDIR 相当于cd WORKDIR /usr/local/nginx-1.20.1 RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install #EXPOSE 映射端口 EXPOSE 80 #CMD 运行以下命令 CMD ["nginx" "-g" "daemon off;"]

2、用Dockerfile生成镜像,通过docker build指令来生成docker镜像

docker build -t   mynginx .

docker images

dockerfile及docker命令总结_docker

如果Dockerfile在当前目录下,输入点.就可以进行加载当前目录下的Dockerfile

如果不在当前目录下需要运行docker build -t mynginx <Dockerfile_dir>加载相对路径下的Dockerfile

查看镜像是否生成:

 

3、通过docker镜像生成一个docker容器

docker run -d -p 8000:80   --name  mynginx_test  mynginx

 

参数说明:

-d 后台运行

-it 前台交互式运行

-P 80 将宿主机的一个未使用的随机端口映射到容器的22端口

-p 8000:80 将宿主机的2222端口映射到容器的22端口

--name mynginx_test 给容器命名为mynginx_tes

mynginx 使用这个镜像镜像创建docker容器

 

三、常用命令总结

镜像:

搜索

docker search <image_name>

下载

docker pull <image_name>

查看

docker images

docker image ls

删除

docker rmi <image_anem>

导出

docker save <image_name> >   ./name.tar.gz

导入

docker load <  ./name.tar.gz

通过容器创建镜像

docker commit <container_id> <image_name>

通过dockerfile创建镜像

docker build -t <image_name>  .  #相对路径

docker build -f /path/to/a/Dockerfile

换标签

docker tag   <container_id>   <登录id名称/image_name>

上传镜像

docker login #登录

docker pull <登录id名称/image_name>

容器:

查看

docker ps

ps默认只会显示容器在“running”的状态的,容器列表

 -a 会查看到所有的容器列表

-q  只显示容器id

进入容器

docker attach  <container_id>  #类似于vnc,操作时会在各个容器界面同步显示,exit后所有容器会被关闭

docker exec -it #进入运行的容器,exit后容器孩子运行

停止

docker stop <container_id>

开始

docker start <container-id>

删除

docker rm <container_id>

重新启动

docker restart <container_id>