Docker基础操作笔记

88 阅读3分钟

安装配置

  • 安装依赖项

    • yum install -y yum-utils device-mapper-persistent-data lvm2

  • 更换镜像源

    • yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  • 安装docker-ce

    • yum install docker-ce docker-ce-cli containerd.io

  • 设置开机启动并启动docker

    • systemctl enable docker && systemctl start docker

  • 安装指定版本docker-compose

    • sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

  • 命令授权

    • chmod +x /usr/local/bin/docker-compose

  • 命令软链接

    • ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Dockerfile编写

命令说明示例
from定制的镜像都是基于 FROM 的镜像。
env定义了环境变量,在后续的指令中,就可以使用这个环境变量。ENV TZ=Asia/Shanghai
arg构建参数,与 ENV 作用一致。不过作用域不一样。只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
run用于执行后面跟着的命令行命令。有两种格式1. shell格式:RUN <命令行命令>2. exec格式:RUN ["可执行文件","参数1","参数2"]每执行一次RUN命令,就会加一层镜像,最终的镜像会越来越大,可以用&&将多个命令连接起来,这样就只会有一层镜像了。RUN ["./test.php", "dev", "offline"]RUN ["./test.php", "dev", "offline"]RUN ./test.php dev offline
copy      从上下文目录中复制文件或者目录到容器中的指定路径下面COPY ./edge-management/build/libs/* /app/
add功能和COPY类似,官方推荐使用COPY    
cmd1. CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。 2. 类似于RUN,但是CMD和RUN 运行的时间点不同,CMD是在docker run 的时候运行,RUN是在Docker build的时候运行 3. 如果 Dockerfile 中如果存在多个 CMD 指令,那么仅最后一个生效。
entrypoint类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。ENTRYPOINT exec java $JAVA_OPTS -jar /app/*
volume定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。在启动容器 docker run 的时候,也可以通过 -v 参数修改挂载点。 避免重要的数据,因容器重启而丢失,也可以避免容器不断变大。
expose仅仅只是声明端口 1. 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。 2. 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口
workdir指定工作目录,用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

常用命令

  • 获取所有容器的IP列表

    • docker inspect --format='{{.Name}}:{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

  • 获取容器的日志位置

    • docker inspect --format='{{.LogPath}}' name

  • 查看容器的启动策略

    • docker inspect --format='{{.HostConfig.RestartPolicy.Name}}' name

  • 容器内部安装vim

    • apt-get update && apt-get install vim

  • 获取所有容器的版本

    • docker ps | awk {'print $2'}

  • 查看指定时间段的日志

    • docker logs --since '2021-01-11T17:13:05.999999999'  --until='2021-01-11T17:15:05.999999999' name

  • 滚动查看最后100行日志

    • docker logs -f --tail 100 name

  • 其它

    1. docker pause/unpause :暂停/恢复容器中所有的进程。

    2. docker top : 查看容器中运行的进程信息,支持 ps 命令参数。

    3. docker --net=host 宿主机网络共享

常见问题

  1. docker报错磁盘空间不够了,是由于镜像分层越来越多,磁盘空间不够用,就需要做一个软链到外部。以后空间增长也是在磁盘外部。ln -s var/lib/docker opt/docker

  2. docker login 报错Error saving credentials:,是由于存储凭证错误;解决就是安装 apt install gnupg2 pass

  3. 容器停止了,但是某些文件并没有挂载出来,可以去docker的存储目录中找到这个文件,一般在diff下

参数

参数说明
-g / --graph="/var/lib/docker"设置Docker运行时根目录
--ip="0.0.0.0"设置容器绑定IP时使用的默认IP地址
--rm当容器退出时自动移除这个容器
-e, --env list设置环境变量
-v, --volume list绑定安装卷
--mount mount将文件系统挂载附加到容器

配置文件

  • Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致

    1. 在 ubuntu 中的位置是:/etc/default/docker

    2. 在 centos6 中的位置是:/etc/sysconfig/docker

    3. 在 centos7 中的位置是:/etc/docker/

  • 在/var/lib/docker中得文件夹

    1. container 运行得容器

    2. overlay2 镜像存储位置

    3. volumes docker自己创建得文件

清理空间

  • 删除所有关闭的容器:

docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm

  • 删除dangling 镜像(无tag 镜像):

docker rmi (docker images | grep "" | awk {'print 3'})

  • 删除dangling 数据卷(无用volume):

docker volume rm $(docker volume ls -qf dangling=true)

  • 删除所有停止的容器:

docker contailer/image/volume prune

容器迁移

save / load

  1. docker save -o images.tar mysql:8.6
  2. docker load -i images.tar

export / import

  1. docker export -o mysql.tar mysql:8.6
  2. docker import mysql.tar mysql:8.6  
  3. 区别
    1. save保存的是镜像,export保存的是容器

    2. load载入镜像包,import载入容器包,但两者都会恢复为镜像

    3. load不能对载入的镜像重命名,import可以为镜像指定新名称

管理工具

portainer

docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name prtainer portainer/portainer

file-browser

docker run -d --name filebrowser -p 9991:80 --restart=always -v /data/file-borwser:/srv filebrowser/filebrowser

minio

docker run -d --name minio-server -p 9110:9000 -p 9111:9111 --restart=always -v /home/admina/minio/data:/data minio/minio:RELEASE.2022-04-08T19-44-35Z server /data --console-address ":9111"