安装配置
- 安装依赖项
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 |
|
cmd |
1. CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。 |
|
entrypoint |
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。 |
ENTRYPOINT exec java $JAVA_OPTS -jar /app/* |
volume |
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。在启动容器 docker run 的时候,也可以通过 -v 参数修改挂载点。 避免重要的数据,因容器重启而丢失,也可以避免容器不断变大。 |
|
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
- [ ] 不省略显示,获取全部信息 --no-trunc
- [ ] update更新参数
docker update --restart=always
- [ 其它
- docker pause/unpause :暂停/恢复容器中所有的进程。
- docker top : 查看容器中运行的进程信息,支持 ps 命令参数。
- docker --net=host 宿主机网络共享
常见问题
- docker报错磁盘空间不够了,是由于镜像分层越来越多,磁盘空间不够用,就需要做一个软链到外部。以后空间增长也是在磁盘外部。ln -s var/lib/docker opt/docker
- docker login 报错Error saving credentials:,是由于存储凭证错误;解决就是安装 apt install gnupg2 pass
- 容器停止了,但是某些文件并没有挂载出来,可以去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 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致
- 在 ubuntu 中的位置是:/etc/default/docker
- 在 centos6 中的位置是:/etc/sysconfig/docker
- 在 centos7 中的位置是:/etc/docker/
- 在/var/lib/docker中得文件夹
- container 运行得容器
- overlay2 镜像存储位置
- volumes docker自己创建得文件
清理空间
- 删除所有关闭的容器:
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm
- 删除dangling 镜像(无tag 镜像):
docker rmi $(docker images | grep "<none>" | awk {'print $3'})
- 删除dangling 数据卷(无用volume):
docker volume rm $(docker volume ls -qf dangling=true)
- 删除所有停止的容器:
docker contailer/image/volume prune
容器迁移
save / load
- docker save -o images.tar mysql:8.6
- docker load -i images.tar
export / import
- docker export -o mysql.tar mysql:8.6
- docker import mysql.tar mysql:8.6
- 区别
- save保存的是镜像,export保存的是容器
- load载入镜像包,import载入容器包,但两者都会恢复为镜像
- 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"
双环的现场环境这两天edge-connection挂了三次,有两次是服务器重启导致的
现象就是:页面报错边缘连接服务异常,edge-connection日志一直是正常,只有最早在启动edge-connection的时候