【开发工具】Docker常用命令及Dockerfile的编写

72 阅读6分钟

一、Docker常用命令


基础命令

docker version
docker info 
docker [命令] --help
	
Ctrl + p + q # 容器不停止退出
exit # 退出容器

image 镜像命令

docker images # 查看所有本地主机镜像
docker search # 搜索docker hub上的镜像
docker pull # 下载镜像
docker push # 发布镜像
docker tag # 重命名镜像,例docker tag ubuntu:latest myubuntu:v1
docker rmi [option] [镜像名称/ID ...] # 删除镜像
	# 参数说明 
	-f # 删除正在运行的容器,$(docker images -aq)删除全部镜像
	-v # 删除容器并移除挂载的卷
	--no-prune # 删除镜像时,保留未标记的父镜像层,即便该父镜像层未被使用
docker commit [option] [容器ID] [目标镜像名]:[tag] # 提交容器制作镜像副本
	# 参数说明:
	-m="提交的描述信息"
	-a="作者"
	
docker history [镜像ID] # 查看镜像构建历史步骤

container 容器命令

# ----- 操作类 -----
docker run [option] [容器ID]# 新建并启动容器,例docker run -it ubuntu /bin/bash
    # 参数说明:
    -d # 后台运行并返回容器ID,注意:后台运行必须要有前台进程!
    -t # 为容器分配伪tty,即模拟控制台进行输入输出
    -i # 运行时开放stdin
    -p # 精确指定端口映射 [宿主机端口]:[容器内端口]
    -P # 自动将容器中所有EXPOSE暴露的端口映射到主机的可用端口
    -e # 用于设置容器内环境变量
    -v # 文件挂载 [主机文件路径]:[容器内文件路径]:[读写权限ro/rw]
    --rm # 单次使用,用完即删除容器
    --net # 制定容器使用的网络
    --name="Name" # 指定容器名称
    --link # 容器之间连通网络
    
docker attach [容器ID] # 进入后台运行的容器,使用正在执行的终端
docker exec [容器ID] [命令行程序] # 进入后台运行的容器,并开启新终端,如/bin/bash
	-t # 创建一个伪终端进行输入输出
	-i # 允许与stdin进行交互
docker start [容器ID] # 启动
docker restart [容器ID] # 重启
docker stop [容器ID] # 停止
docker kill [容器ID] # 强制停止
docker rm [option] [容器ID ...] # 删除容器
	# 参数说明:
	-f 删除正在运行的容器
	-v 删除容器并移除挂载的卷
	--link 删除与之相关的链接


# ----- 数据类 -----
docker ps # 列出当前活跃的容器信息
docker top [容器ID] # 查看容器的用户ID,进程/父进程ID等信息
docker inspect [容器ID] # 查看容器的元数据
docker port [容器ID] # 查看端口映射,一般为 容器暴露的端口 -> 0.0.0.0:宿主机端口
docker cp [容器ID]:[容器内文件路径] [主机目标文件夹路径] # 在容器内拷贝文件到主机上
docker stats # 实时显示容器的资源使用情况
docker logs [option] # 查看日志
	# 参数说明:
	-f # 实时跟踪日志输出
	-t # 显示时间戳
	--tail [number] # 显示多少条日志

volume 命令

docker volume create [option] [卷名] # 创建新卷
	# 参数说明:
	--driver local # 指定卷的驱动(默认为local)
	--label key=value # 设置卷标签
	--opt # 设置驱动特定选项,type=[挂载的类型],device=[指定设备],size=[卷大小],uid=[用户ID]
	
docker volume ls # 列出所有匿名和具名卷
docker volume inspect # 查看卷的详细信息
docker volume rm # 删除一个或多个卷
docker volume prune # 清理未使用的卷
  1. 卷的具名和匿名挂载
# 匿名挂载:启动容器时,主机路径缺省,只指定其容器内的挂载点
docker run -v [容器文件路径] 

# 具名挂载:启动容器时,给容器卷起名,并指定容器的的挂载点
docker run -v [卷名]:[容器文件路径]

# docker中所有未指定目录的卷都在 /var/lib/docker/volumes/ 目录下
  1. 卷的读写权限
# 在启动容器时,挂载目录可以指定卷的读写权限
docker run -v [主机文件路径/卷名]:[容器文件路径]:[卷读写权限ro/rw]
	# ro表明该卷只能通过宿主机来进行操作,容器内部只读无法修改卷数据
	# rw表明宿主机和容器都可以读写该卷
  1. 数据卷容器——数据卷被挂载的父容器
# 在启动容器时,设置父容器实现多个容器之间的数据卷同步共享,
docker run --name [docker-son] --volumes-from [docker-father] [容器ID]
# 子容器使用硬连接的方式使用数据卷容器,当父容器被删除时数据卷容器仍然可以使用,数据卷容器的生命周期可以持续到无容器使用为止。

二、Dockerfile编写

语法

  1. 保留关键字(指令)必须大写
  2. 从上到下顺序执行
  3. 每个指令都会提交一次镜像层

指令

Dockerfile 指令说明
FROM指定基础镜像,用于后续的指令构建。
LABEL添加镜像的元数据,使用键值对的形式。
RUN在构建过程中在镜像中执行命令。
CMD设置容器启动时需运行的默认命令,会被docker run的命令覆盖,只有末尾的CMD生效。
ENTRYPOINT设置容器启动时需运行的命令,是容器唯一的主命令,docker run的命令可附加上去。
EXPOSE暴露网络端口。
ENV在容器内部设置环境变量。
ADD将文件、目录或远程URL复制到镜像中,该命令会自动解压缩包。
COPY将文件或目录复制到镜像中。
VOLUME为容器创建挂载点或声明卷。
WORKDIR设置后续指令的工作目录。
USER指定后续指令的用户上下文。
ARG定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置。
ONBUILD当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL设置发送给容器以退出的系统调用信号。
HEALTHCHECK定义周期性检查容器健康状态的命令。
SHELL覆盖Docker中默认的shell,用于RUN、CMD和ENTRYPOINT指令。
FROM ubuntu:24.04

RUN set -x; buildDeps='gcc libc-dev make cmake wget vim net-tools openssh-server inetutils-ping' \ 
	&& apts update && apt-get install -y --no-install-recommends  $buildDeps  \

# 清理 APT 缓存,减少镜像大小
    && rm -rf /var/lib/apt/lists/* \
    
# 卸载构建所需的依赖包,并自动移除不再需要的依赖
    && apt purge -y --auto-remove $buildDeps
    
# 创建保存公钥的文件夹并设置权限
RUN mkdir -p /root/.ssh && chmod 700 /root/.ssh \
	&& touch /root/.ssh/authorized_keys && chmod 600 /root/.ssh/authorized_keys  

# 拷贝公钥到服务器
COPY ubuntu2404.pub /root/.ssh/authorized_keys

# 容器运行时运行ssh
CMD ["/usr/sbin/sshd", "-D"]
    
# 挂载匿名卷
VOLUME /home/host-data 

# 容器健康状态检查
# HEALTHCHECK --interval=5s --timeout=3s 

# SHELL [binsh, -c]# 一、Docker常用命令 

构建步骤

  1. 编写dockerfile
  2. docker build 构建镜像
  3. docker run 运行镜像
  4. docker push 发布镜像

三、Docker自定义网络

通过创建自定义网络容器间互联,隔离不同网络的集群。

常见docker网络驱动程序

名称描述
bridge默认的网络驱动程序。用于将多个容器连接到一个共同的网络桥接器上,使它们可以相互通信。适用于在单个主机上运行的独立容器或简单的多容器应用。
host使容器使用宿主机的网络栈。容器不再拥有独立的网络命名空间。适用于需要高性能网络且不需要网络隔离的场景,如监控工具或需要完全访问主机网络的应用。在 Windows 和 Mac 上不可用。
overlay用于在多主机 Docker 集群中创建覆盖网络,使不同主机上的容器可以相互通信。适用于使用 Docker Swarm 或 Kubernetes 等编排工具的分布式应用。
macvlan将容器直接连接到宿主机的物理网络,给每个容器分配一个 MAC 地址,使它们像物理设备一样直接与网络通信。适用于需要完全控制容器网络配置或与物理网络设备直接通信的场景。
none不配置网络。容器只有 lo(环回)接口,没有其他网络接口。适用于完全禁用网络功能的容器,如需要极高的安全性或隔离性的场景。
plugin第三方或自定义网络驱动程序。允许使用由社区或第三方提供的网络插件。适用于需要特定功能或与特定网络环境集成的场景。

网络创建方法

docker network create [option] [网络名] # 创建自定义网络
	# 参数说明:
	--driver # 指定网络驱动程序
	--subnet # 配置子网,例192.168.0.0/16
	--gateway # 配置网关,例192.168.0.1

不同网络之间的连通

通过将容器添加到不同网络中,可实现一个容器拥有多个ip

docker network connect [option] [网络名] [容器ID] # 使容器跨网络连通

四、安装使用Ubuntu

# 1.搜索Ubuntu版本
docker search ubuntu

# 2.拉取镜像
docker pull ubuntu:22.04

# 3.运行容器
docker run	 -itd \
			--name my-ubuntu \
			-p [主机端口]:[容器端口] \
		  	-v [主机文件路径]:[容器路径] \
		  	ubuntu:22.04
		  	
# 4.进入Ubuntu
docker exec -it my-ubuntu /bin/bash
		  	

五、安装使用MySQL

# 1.搜索MySQL版本
docker search mysql

# 2.拉取镜像
docker pull mysql:8.0.37 

# 3.启动mysql
docker run 	 -d -i -t \
			--name [mysqlname] \
			-p [主机端口]:[容器端口] \
		  	-v [主机文件路径]:[容器路径] \
		  	-e MYSQL_ROOT_PASSWORD=[mysql登录密码] \
		  	[mysql]:[tag]	# 运行镜像名称

# 4.进入mysql容器

# 5.登录123456mysql
mysql -h localhost -u root -p

# 实例
docker run --name mysql0227 -e MYSQL_ROOT_PASSWORD=123456 -it -p 3306:3306 --privileged=true  [镜像名称]

六、Ubuntu基础工具、C++开发调试工具

# 1.Linux工具:ping netstat trace
# 2.C++开发套件:g++ gdb ssh rsync make cmake zip
# 3.远程工具:openssh-server

sudo apt-get update && \
sudo apt-get install -y openssh-server build-essential g++ cmake gdb rsync zip && \
sudo service ssh start && sudo service ssh enable





### 构建步骤

1. 编写dockerfile
2. docker build 构建镜像
3. docker run 运行镜像
4. docker push 发布镜像





------

# 三、Docker自定义网络

通过创建自定义网络容器间互联,隔离不同网络的集群。



### 常见docker网络驱动程序

| **名称** | **描述**                                                     |
| -------- | ------------------------------------------------------------ |
| bridge   | 默认的网络驱动程序。用于将多个容器连接到一个共同的网络桥接器上,使它们可以相互通信。适用于在单个主机上运行的独立容器或简单的多容器应用。 |
| host     | 使容器使用宿主机的网络栈。容器不再拥有独立的网络命名空间。适用于需要高性能网络且不需要网络隔离的场景,如监控工具或需要完全访问主机网络的应用。在 Windows 和 Mac 上不可用。 |
| overlay  | 用于在多主机 Docker 集群中创建覆盖网络,使不同主机上的容器可以相互通信。适用于使用 Docker Swarm 或 Kubernetes 等编排工具的分布式应用。 |
| macvlan  | 将容器直接连接到宿主机的物理网络,给每个容器分配一个 MAC 地址,使它们像物理设备一样直接与网络通信。适用于需要完全控制容器网络配置或与物理网络设备直接通信的场景。 |
| none     | 不配置网络。容器只有 `lo`(环回)接口,没有其他网络接口。适用于完全禁用网络功能的容器,如需要极高的安全性或隔离性的场景。 |
| plugin   | 第三方或自定义网络驱动程序。允许使用由社区或第三方提供的网络插件。适用于需要特定功能或与特定网络环境集成的场景。 |



### 网络创建方法

```shell
docker network create [option] [网络名] # 创建自定义网络
	# 参数说明:
	--driver # 指定网络驱动程序
	--subnet # 配置子网,例192.168.0.0/16
	--gateway # 配置网关,例192.168.0.1
```



### 不同网络之间的连通

通过将容器添加到不同网络中,可实现一个容器拥有多个ip

```shell
docker network connect [option] [网络名] [容器ID] # 使容器跨网络连通
```





------



# 四、安装Ubuntu

~~~shell
# 1.搜索Ubuntu版本
docker search ubuntu

# 2.拉取镜像
docker pull ubuntu:20.04

# 3.运行容器
docker run	 -itd \
			--name my-ubuntu ubuntu:20.04 \
			-p [主机端口]:[容器端口] \
		  	-v [主机文件路径]:[容器路径] \
		  	
# 4.进入Ubuntu
docker exec -it my-ubuntu /bin/bash
		  	

五、安装使用MySQL

# 1.搜索MySQL版本
docker search mysql

# 2.拉取镜像
docker pull mysql:8.0.37 

# 3.启动mysql
docker run 	-d -i -t \
			--name [mysqlname] \
			-p [主机端口]:[容器端口] \
		  	-v [主机文件路径]:[容器路径] \
		  	-e MYSQL_ROOT_PASSWORD=[mysql登录密码] \
		  	[mysql]:[tag]	

# 4.进入mysql
mysql -h localhost -u root -p