一文看懂Docker
一文看懂Docker
什么是 Docker?
Docker是一种工具,用于创建、部署和运行应用程序(通过使用容器)。容器使开发人员可以将应用与需要的所有部件(库、框架、依赖项等)打包为一个包一起交付。使用容器可确保此应用的运行与之前相同,而不受任何自定义设置或运行该应用的计算机上先前安装的库的影响(运行应用的计算机可能与用于编写和测试应用代码的计算机不同)。这使开发人员可以专注于编写代码,而无需操心将运行代码的系统。
docker容器与虚拟机类似,但不会创建整个虚拟操作系统。相反,docker允许应用使用与运行它的系统相同的Linux内核。这使得应用包能够仅要求主计算机上尚未安装的部件,从而降低包大小以及提高性能。
Dockerfile
Dockerfile是一种文本文件,其中包含用于生成和运行Docker镜像的说明:
- 用于创建新镜像的基础镜像或父级镜像
- 用于更新基础操作系统和安装其他软件的命令
- 要包含的生成项目,例如开发的应用程序
- 要公开的服务,例如存储和网络配置
- 要在启动容器时运行的命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用 Ubuntu 作为基础镜像
FROM ubuntu:latest
# 运行命令
RUN apt update && apt install -y nginx
# 设置工作目录
WORKDIR /var/www/html
# 复制文件到容器
COPY index.html /var/www/html/index.html
# 暴露端口
EXPOSE 80
# 启动命令
CMD ["nginx", "-g", "daemon off;"]
Docker image
docker镜像是存储在电脑上的大型文件,可通过docker CLI和docker Desktop来管理镜像,包括生成、列出、删除和运行镜像。客户端不直接执行命令,它会将所有查询发送到后台的dockerd守护程序。
docker镜像的常用命令如下:
- 生成镜像:
docker build -t my_image .
,需要在Dockerfile所在目录下运行该命令。-t
参数用于命名和标记镜像。 - 创建标签:
docker tag my_image:latest my_image:dev
,如果未指定标签,将默认使用 latest 标签。 - 下载镜像:
docker pull image_name:version
- 列出镜像:
docker images
- 删除镜像:
docker rmi my_image:1.0
- 检查镜像:
docker inspect my_image
,用于查看镜像
Docker container
容器好比一个简易的Linux操作系统,以host_para:con_para
的方式设置参数时,均为主机参数在前,容器参数在后。
- 运行容器:标准语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
;具体示例docker run -it ubuntu:latest bash -c "python /src/main.py"
;常用的参数包括:-i
:以交互模式运行容器,通常与-t
同时使用;-t
:启动容器后,为容器分配一个终端;-d
:后台运行;--name my_name
:指定容器名称;-p 8080:80
:将容器的80端口映射到主机的8080端口-v host_dir:container_dir
:将容器的目录挂载到主机上-e USER_NAME=Jack
:设置环境变量-u root
:指定用户,例如指定用户为root,这里只是指定了root用户身份,但不是真正拥有root权限–privileged
:以root权限创建容器,当进入容器之后,拥有root权限去执行命令
- 列出运行中的容器:
docker ps
,-a
查看所有容器(包括已停止的) - 进入运行中的容器:
docker exec -it my_container bash
- 停止容器:
docker stop my_container
- 删除容器:
docker rm my_container
- 重启容器:
docker restart my_container
Docker 数据管理
- 查看容器日志:
docker logs my_container
- 查看容器内正在运行的进程:
docker top my_container
- 拷贝文件到容器:
docker cp myfile.txt my_container:/home/
- 从容器拷贝文件到本地:
docker cp myfile.txt my_container:/home/
Docker 网络管理
docker默认有两个网络,host和bridge,用户也可以创建自定义的docker网络,两个container想要通信的话需要位于同一个docker网络之中。
- 查看docker网络:
docker network ls
- 创建自定义网络:
docker network create my_network
- 查看特定的网络详情:
docker network inspect my_network
- 让容器加入网络:
docker network connect my_network my_container
,另一种常见的做法是在运行容器时通过--network=my_network
来指定容器要加入的网络 - 将容器移除网络:
docker network disconnect my_network my_container
Docker Compose(多容器管理)
- 启动Compose应用:
docker-compose up
:启动所有docker-compose服务,-d
后台运行。 - 停止Compose应用:
docker-compose down
- 查看Compose应用日志:
docker-compose logs
Docker Volume(数据持久化)
当容器被删除后,容器中产生的数据将一并被删除。如果想要保存容器在运行中的数据,就需要将容器挂载到主机上以实现容器目录数据与宿主机数据卷目录数据同步。如果多个容器之间想要实现数据交互,只需将多个容器挂载同一个目录,即可实现多个容器的通信。
- 创建数据卷:
docker volume create my_volume
- 查看所有数据卷:
docker volume ls
- 删除数据卷:
docker volume rm my_volume
- 挂载数据卷:
docker run -d --name my_container -v my_volume:/data ubuntu
This post is licensed under CC BY 4.0 by the author.