一、一些命令
1、run:由进行生成一个运行的容易
-i => interactive 保持标准输入流对容器开放,即使容器没有终端连接
-t => tty 给容器分配一个虚拟终端
-d => detach 后台运行
-p => ports 映射端口
--rm 容器停止运行之后自动删除
docker run --name container-name image-name ping localhost
2、create:由镜像生成一个未运行的容器
3、logs:docker logs container-name 打印容器日志
4、rm、start、kill、stop
5、exec:进入运行中的容器内部
docker exec -it container-name /bin/bash
6、images、rmi、tag、history 操作镜像
7、删除所有已经退出的容器\未使用的镜像
docker system prune -f
docker image prune -a
8、查看数据卷、删除未使用的数据卷
docker volume ls
docker volume inspect VOLUME_NAME
docker volume prune
二、数据卷
当我们在容器中运行一些关键的应用如M有SQL、Redis等服务时,会存储一些关键数据,这些数据是即使删除容器也不应该被删除的,此时就需要使用数据卷,我们可以通过Docker提供的相关命令,来将主机中的某一个文件目录映射到容器中,此时当你在容器中操作该目录下的文件时,实际上操作的就是主机中的文件。
数据卷相当于是容器的虚拟文件系统和主机的真实文件系统之间的一个桥梁,建立数据卷就相当于打通了容器与主机之间的交互通道,可以荣容器运行时所产生的数据变更被保存到主机中,能够更方便地对数据进行备份和保护。
创建卷使用docker volume create VOLUME_NAME,这个命令将在/var/lib/docker/volumes/下创建一个卷。
--volume或-v,绑定并加载主机的某个文件目录到容器中,只能创建bind-mount,在容器启动时使用以下格式来完成映射。若host_dir不存在,自动创建,如果host_dir不合法,则会将其作VOLUME_NAME自动创建。数据卷映射目录默认在 /var/lib/docker/volumes/
-v host_dir:container_dir
docker run --rm -d -p 80:80 -v /www/test:/www/test:ro -v
/etc/nginx/nginx.conf:/etc/nginx/nginx.conf nginx
将主机目录映射到容器中以后,在容器中读取到的就是主机上的文件。
三、构建镜像
1、Commit:从容器创建镜像
有的时候你可能需要对一个已经运行的容器内的环境做出一些改变,而你希望之后即使这个容器被删除也能够保持这些改动,便于下载再启动一个新的容器,此时便可以利用docker commit命令将一个容器重新打包为一个镜像。从nginx容器创建一个名为image-dev的新镜像。用来构建镜像的容器必须是正在运行的容器。
docker commit -m "add git" nginx image-dev
2、Registry:从远程创建镜像
默认是从dockerhub拉取镜像,也可以自己修改镜像拉取地址
docker image pull [quay.io/bitnami/nginx]
3、Tag:给镜像打标签,生成新镜像
docker tag old-image:v1 new-image:v2
4、从本地文件导入镜像
导出镜像,-o代表output
docker image save nginx:1.20.0 -o nginx.image
导入镜像,-i代表input
docker image load -i images/nginx.image
5、Dockerfile
Dockerfile是用于构建docker镜像的文件,其中包含了构建镜像所需的指令,有特定语法规则:
FROM:告诉Docker从哪个镜像创建新镜像
MAINTAINER:设置镜像维护者的名字和邮箱
RUN:运行命令
ENTRYPOINT:镜像入口点,配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","/app.jar"]
ADD:ADD和COPY都能复制文件至镜像中,如果目标目录不存在,则会自动创建。
ADD比COPY高级一点的地方就是,如果复制的是一个gzip等压缩文件,ADD会帮助我们自动解压。 因此我们应该遵循一个原则,所有文件的复制均使用COPY,仅在需要自动解压的场景使用ADD
ADD target/*-server*.jar /app.jar
ENV:设置镜像的环境变量。ENV与ARG的区别,ENV设置的变量在容器启动之后仍然可以使用,而ARG设置的变量只能在镜像构建过程中使用。
ENV APPROOT="/app" APP="mailer.sh" VERSION="0.6"
WORKDIR:类似cd命令,设置当前工作目录,如果指定目录不存在,那么这个目录会被自动创建
WORKDIR $APPROOT
VOLUME:设置数据卷,挂载到主机目录。我们无法在镜像构建过程中指定一个(bind-mount)卷或者只读卷,这个指令只能在文件系统中创建一个指定位置,然后将一个卷定义添加到镜像元数据中。
VOLUME ["/var/log"]
EXPOSE:暴露端口
CMD:容器启动时默认运行的命令,如果在docker run启动容器时指定了其他命令,则CMD命令将会被忽略,如果定义了多个CMD,则只有最后一个会被执行。与ENTRYPOINT相似,区别就是ENTRYPOINT所设置的命令无法被覆盖掉。ENTRYPOINT可以和CMD联合使用,ENTRYPOINT设置所执行的命令,CMD传递参数。如下,此时我们也可以在docker run命令最后传入参数覆盖CMD。
FROM ubuntu:20.04
ENTRYPOINT ["echo"]
CMD ["hello"]
CMD和ENTRYPOINT同时支持shell格式和exec格式,当使用exec格式需要使用变量时,应改为shell脚本格式运行。如果ENTRYPOINT使用了shell格式,那么CMD指令停工的所有参数都会被忽略。
CMD echo "hello"
CMD ["echo","hello"]
CMD ["sh","-t","$Hello"]
docker build:Dockerfile文件编写好之后用docker build命令来构建镜像
-t => tag
-f => file 用来指定Dockerfile的名字,默认名称为Dockerfile
docker build -f dockerfile-test -t demo-server:1.0.0 .
docker build命令使用格式,DOCKERFILE_PATH为Dockerfile所在路径
docker build [OPTIONS] DOCKERFILE_PATH
在Dockerfile中每一个RUN指令就会生成一个新的layer,过多使用不必要的指令会导致镜像臃肿,推荐将多个命令放在一个RUN指令指令中执行通过 && 拼接,使用 \ 换行
一个简单的dockerfile
FROM ubuntu:20.04
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y python3.9 python3-pip python3.9-dev
ADD hello.py /hello.py
CMD ["python3","/hello.py"]
docker有一个基础空镜像scratch
Dockerfile缓存技巧,将经常容易改变的指令放在后面,不容易发生改变的放在前面,提高镜像构建速度。
dockerignore:在Dockerfile所在目录添加.dockerignore文件减少不必要的构建环境的发送,提高构建速度。构建环境就是执行docker build时Dockerfile所在文件夹。比如下面指令build context就是当前文件夹,我们应忽略文件夹中的无关文件。
docker build -f dockerfile-test -t demo-server:1.0.0 .
多阶段构建:如果构建镜像所依赖的镜像 只在构建过程中起作用,而在容器过程中不起作用的话,那么这个被依赖的镜像不应该被打包到最终的镜像当中,会增加输出镜像体积。这时候我们可以使用多阶段构建,可以存在多个FROM,如下gcc镜像只用来生成二进制文件,在执行二进制文件时并不依赖于gcc。
FROM gcc:9.4 AS builder
COPY hello.c /src/hello.c
WORKDIR /src
RUN gcc --static -0 hello hello.c
FROM alpine:3.13.5
COPY --from=builder /src/hello /src/hello
ENTEYPOINT ["/src/hello"]
CMD []
尽量使用非root用户:
chown:更改属主、属组
-r:创建系统组\账号
-R:当前文件夹和子文件夹,若不设置则为当前文件夹
RUN groupadd -r flask && \
useradd -r -g flask flask && \
chown -R flask:flask /src
USER flask
四、容器编排Docker-Compose
针对单机多容器部署,Docker-Compose可以高效便捷的管理单机上运行的所有容器,通过yaml配置文件的方式完成之前执行的docker run命令所设置的所有参数,我们可以先针对单机上的所有容器进行相关配置,配置完成后即可使docker-compose对单机多容器进行高效的管理。
新建一个docker-compose.yml文件使用以下命令以后台方式运行容器
docker-compose up -d
基本语法结构
servicebname与通过docker run创建容器时使用的--name类似,这个名字可以被其他连在这个bridge的容器ping通。
在docker-compose.yml文件中image镜像若在本机未找到,就会自动到dockerhub拉取,也可以用build关键字通过Dockerfile来构建,对应的value为Dockerfile的目录,默认文件名为Dockerfile,若想为Dockerfile改名,应该如下设置。
services:
flask-demo:
build:
context: ./flask
dockerfile: Dockerfile.dev
相关命令
docker-compose restart
docker-compose up -d --build
docker-compose up -d --remove-orphans