docker
镜像build
示例
- 目录结构
.
├── build.sh
└── custom_image/
├── Dockerfile
└── Miniconda3-latest-Linux-x86_64.sh
1 directory, 3 files
- build.sh
docker build --network=host -f ./custom_image/Dockerfile -t custom_image:v0 custom_image
参数:
- –network=host: 解决docker build 时网络不通的问题,
- -f: 指定Dockerfile
- -t: 镜像tag,
- custom_image: 镜像build时
上下文
所在 目录, 若是.
, 表示当前目录即是上下文所在目录。 方便COPY时知道相对路径, 如:COPY ./Miniconda3-latest-Linux-x86_64.sh /home/admin/
运行
build
用sodu docker build …
不然会出现 连不上dockerd(因为dockerd 一般是root权限启动)
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
images
列出本地镜像
run
sudo docker run -itd --net=host custom_image:v0
or
sudo docker run -itd --net=host $imageid
注意 --net 的几种模式
ps
查看有哪些docker容器在运行
sudo docker ps
本机所有状态的docker容器
sudo docker ps -a
有些容器在run时,启动命令执行完,就退出了,此时容器不是运行状态,需要ps -a 才能看到
进入docker
sudo docker exec -it $container_id /bin/bash
stop
终止正在运行中的容器
sudo docker stop $container-id
删除容器, 这些容器可能没有处于运行状态(ps -a查看)
sudo docker rm $container-id
push
sudo docker login ${docker-repo-service}
sudo docker push
d
o
c
k
e
r
−
r
e
p
o
−
s
e
r
v
i
c
e
/
{docker-repo-service}/
docker−repo−service/{user-name}/
i
m
a
g
e
−
n
a
m
e
:
{image-name}:
image−name:{version}
rmi
删除本机镜像
sudo docker rmi $imageid
若提示还有容器依赖此镜像,可以 ps -a 查看
Issue
- rpm Error
在docker 里yum install 的时候,有时候会出现类似的错:
Rpmdb checksum is invalid: dCDPT(pkg checksums): sudo.x86_64 0:1.8.6p3-29.el6_9 - u
可以在Dockerfile 里 重建 rpm 的db
RUN set -x && \
sudo rpm --rebuilddb && \
sudo yum -y install cmake && \
注:有些文章说 用yum clean all,但这个比较危险
ref
dockerfile
RUN:
RUN 命令执行命令并创建新的镜像层,通常用于安装软件包.
- 注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.
多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。
RUN书写时的换行符是\
CMD & ENTRYPOINT
- 相同点:
- 只能写一条,如果写了多条,那么只有最后一条生效
- 容器启动时才运行,运行时机相同
- 不同点:
- ENTRYPOINT不会被运行的
docker run
覆盖,而CMD则会被覆盖 - 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD指令不是一个完整的可执行命令,那么CMD指定的内容将会作为ENTRYPOINT的参数. 如下:
FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"]
- 如果我们在Dockerfile种同时写了ENTRYPOINT和CMD,并且CMD是一个完整的指令,那么它们两个会互相覆盖,谁在最后谁生效, 如下:
那么将执行ls -al ,top -b不会执行。FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ls -al
- ENTRYPOINT不会被运行的
ref
- https://blog.csdn.net/sanyuedexuanlv/article/details/79283393
- https://www.jianshu.com/p/f0a0f6a43907
Service solution
- 在docker容器中启动多个服务: https://docs.docker.com/config/containers/multi-service_container/