Docker
install
ubuntu
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo docker run hello-world
debian
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
cmd
常用
显示所有的容器,包括未运行的 docker ps -a
获取容器/镜像的元数据 docker inspect
显示运行中 docker 使用的 IP 地址 docker inspect mycontainer1 | grep IPAddress
build
当你使用 docker build
命令构建镜像时,镜像会被保存在你本地电脑上的 Docker 镜像仓库中。通常,这个仓库位于 /var/lib/docker
目录中。要查看镜像仓库中所有的镜像,可以使用 docker images
命令。如果你想要查看镜像的详细信息,可以使用 docker inspect
命令。
docker image build .
这样操作的 REPOSITORY TAG 都为 <none>
使用 docker tag
docker tag <image> <tag>
docker tag <your_image name or id> <tag>
docker tag my-img my-repo:my-tag
dockerfile_name 可以在同一项目里放置多个 dockerfile
docker build -t my_image -f dockerfile_name .
构建时显示完整日志。该命令将会在构建期间显示完整的日志,而不是收缩的默认输出。
docker build --progress=plain .
run
运行 docker:
- 启动 docker 服务:
sudo service docker start
- 进入 docker 终端:
docker run -it [image_name] /bin/bash
在 docker 里运行命令:
- 在 docker 终端中输入命令,按下回车执行。例如:
ls
查看当前目录文件列表。 - 也可以在运行 docker 时指定要执行的命令,例如:
docker run [image_name] ls
查看当前目录文件列表。
退出 exit
/ Ctrl + D
exec
在运行的容器中执行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS说明
-d
: 分离模式: 在后台运行-i
: 即使没有附加也保持STDIN 打开-t
: 分配一个伪终端
e.g.
docker exec -it container_id /bin/bash
save
# 在 Linux 上将 Docker image my_image 打包为 tar 文件 my_image.tar
docker save my_image > my_image.tar
# 将 tar 文件复制到本地
scp my_image.tar user@localhost:~/
# 将 tar 文件导入到本地的 Docker 中
docker load < my_image.tar
cp
dockerfile 内互相拷贝
参考上面的 e.g.
一个docker里的文件迁移到另一个docker
要将一个Docker容器中的文件迁移到另一个Docker容器,你需要使用Docker的cp
命令。首先,使用docker ps
命令查看正在运行的Docker容器的ID。然后,使用以下命令将文件从源容器复制到目标容器:
docker cp [source_container_id]:/path/to/source/file [target_container_id]:/path/to/target/file
例如,如果要将一个名为myfile.txt
的文件从源容器4fa6e0f0c67a
复制到目标容器8dbd9e392a96
,你可以使用以下命令:
docker cp 4fa6e0f0c67a:/myfile.txt 8dbd9e392a96:/myfile.txt
请注意,在上面的命令中,/path/to/source/file
和/path/to/target/file
都是相对于Docker容器中的根目录的路径。因此,如果文件在Docker容器中的其他目录下,你需要指定完整的路径。
ps
# default shows just running
docker ps
# Show all containers, include dead
docker ps -a
# Display total file sizes
docker ps -s
# Only display container IDs
docker ps -q
# filter
docker ps --filter status=running
status: created, restarting, running, removing, paused, exited, dead
multi-stage
参数传递
- ARG 声明传入的参数
- FROM 分隔了不同的构建阶段
- 不同构建阶段必须先声明 ARG 后才能使用
ARG COMMIT_ID
ARG APP_VERSION
# stage 1
FROM augus/basin-env:latest AS stage-compile
ARG COMMIT_ID
ENV WORK_PATH /augus
WORKDIR ${WORK_PATH}
RUN ${WORK_PATH}/a.sh ${COMMIT_ID}
# stage 2
FROM debian:latest AS stage-runtime
ARG COMMIT_ID
ARG APP_VERSION
ENV WORK_PATH /augus
ENV PROJECT_NAME "AUGUS"
ENV PROJECT_SYS_TYPE "Linux_x86_64"
ENV RELEASE ${PROJECT_NAME}_v${APP_VERSION}_${PROJECT_SYS_TYPE}_${COMMIT_ID}.deb
RUN echo ${RELEASE}
WORKDIR ${WORK_PATH}
COPY --from=stage-compile ${WORK_PATH}/${RELEASE} .
通过 --build-arg KEY="VAL"
传入参数
指定阶段
docker build --target stage-runtime -t augus/test:runtime .
阶段内引用
FROM debian:latest AS base
# ...
FROM base AS derive
# ...
FROM derive AS son
# ...
check docker
初始化判断docker中某镜像是否存在
CON=`docker image ls 'augus:latest' | wc -l`
if [ $CON -eq 2 ] #CON取值为2表示镜像存在,为1镜像不存在
then
docker rmi augus #镜像存在时remove
fi
第一个 docker
要写一个 Dockerfile,需要按照以下步骤进行:
打开一个文本编辑器,新建一个文件,并命名为“Dockerfile”(注意文件名的大小写)。
在文件中输入以下内容:
docker# 指定基础镜像 FROM <base image> # 指定维护人员的名字和电子邮件地址 MAINTAINER <name> <email> # 安装需要的软件包 RUN <command> # 拷贝文件到容器中 COPY <src> <dest> # 暴露容器中的端口 EXPOSE <port> # 容器启动时运行的命令 CMD <command>
根据需要,修改上面各项内容的具体值。例如,如果你想基于 Ubuntu 镜像构建容器,那么 FROM 命令就应该写成:FROM ubuntu。
保存文件,并在命令行中运行以下命令来构建镜像:
shelldocker build -t <image name> .
构建完成后,就可以使用以下命令来运行容器:
shelldocker run -d -p <host port>:<container port> <image name>
这样就完成了一个 Dockerfile 的编写。
需要注意的是,上面的内容是 Dockerfile 的基本结构和写法,但是实际写 Dockerfile 时还需要注意一些其他的事项。例如,你需要根据需要调整命令的执行顺序,确保每个命令都能够正常执行。此外,你还需要注意每个命令的格式,确保命令能够正确识别。
总之,写 Dockerfile 需要注意很多细节,需要结合实际情况来进行调整和优化。如果遇到问题,可以查阅相关文档或者询问更有经验的开发人员。
docker 间通信
bridge 网络通信,不建议,此处略。
在宿主机,ifconfig
查看各个 docker 的 ip。直接在 docker A 上指定 服务器 ip 访问 docker B
dockerfile
EXPOSE
功能为暴漏容器运行时的监听端口给外部,但是EXPOSE并不会使容器访问主机的端口
如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -p
参数
VOLUME
可实现挂载功能,容器告诉Docker在主机上创建一个目录(默认情况下是在/var/lib/docker),然后将其挂载到指定的路径。当删除使用该Volume的容器时,Volume本身不会受到影响,它可以一直存在下去。
FROM centos
#将该镜像的存储内容挂载到test文件夹下。这样即使删除了该镜像,再重新创建后,也不会影响数据
VOLUME /test
CMD echo "hello docker"
sol
docker 会损失性能吗
debian 源加入 阿里云 的镜像源 会抛出 Certificate verification failed
Certificate verification failed: The certificate is NOT trusted. The certificate issuer is unknown. Could not handshake: Error in the certificate verification.
todo
不同系统可能出现不同的问题
在一次 docker 编译 c++ 代码实践中,mac 平台出现 Relocations in generic ELF (EM: 62)
异常,linux 平台可以正常编译
docker 源超时问题
加上国内源,在 dockerfile 里导入
RUN cp /etc/apt/sources.list /etc/apt/sources.list.bak
COPY source_aliyun /home
RUN cat /home/source_aliyun >> /etc/apt/sources.list
RUN apt-get update
如果加上国内源出现Certificate verification failed: The certificate is NOT trusted. The certificate issuer is unknown. Could not handshake: Error in the certificate verification.
可以尝试加上 echo 'Acquire { https::Verify-Peer false }' >>/etc/apt/apt.conf.d/99synaptic
Error: You don't have enough free space in /var/cache/apt/archives/
docker system prune