Docker 镜像管理
Docker是一个容器化平台,通过操作系统级别的虚拟化技术,实现软件的打包和容器化运行。借助Docker,开发人员能够将应用程序以容器的形式进行部署。
概念
Docker、镜像、容器、仓库的概念
Docker利用容器来运行应用,容器从镜像创建运行的实例
-
镜像(image) :镜像是
Docker的基本概念,它是一个轻量且独立的可执行软件包。可以将镜像看作是一个包含了完整运行环境的模板,其中包括应用程序、库和依赖。- 可以使用
docker pull命令从Docker Hub或其他镜像仓库中获取镜像 - 可以使用
docker build命令通过Dockerfile构建自定义镜像
- 可以使用
-
容器(container) :容器是基于镜像创建的运行实例,容器是轻量级的,共享主机操作系统的内核,可以更高效地运行多个容器。
- 可以使用
docker run命令来创建并启动一个容器 - 可以使用
docker start、docker stop、docker restart命令来分别启动、停止和重启容器
- 可以使用
-
仓库(repository) :是集中存放镜像文件的场所。
- Docker Hub(hub.docker.com/):全球最大的Docker镜像仓库,包含了大量的官方和社区维护的镜像,但是在国内访问速度较慢。
- 阿里云容器镜像服务(cr.console.aliyun.com/):阿里云提供的Docker镜像仓库服务,包含了丰富的官方和开源镜像,访问速度较快。
- 腾讯云容器镜像服务(cloud.tencent.com/product/tcr):腾讯云提供的Docker镜像仓库服务,支持私有仓库和公有仓库,访问速度较快。
- 华为云容器镜像服务(console.huaweicloud.com/cr):华为云提供的Docker镜像仓库服务,支持私有仓库和公有仓库,访问速度较快。
-
Dockerfile :
Dockerfile是一个文本文件,用于定义如何构建Docker镜像。它包含一系列的指令和配置项,例如基础镜像、运行命令、复制文件、设置环境变量等。- 通过编写
Dockerfile,可以创建包含自定义配置和应用程序的镜像。
- 通过编写
-
数据卷(volume) :数据卷是用于持久存储数据的特殊目录或文件。数据卷可以在容器之间共享和重用,使得数据持久化且不受容器状态的影响。
- 可以使用
-v参数来创建和管理数据卷。
- 可以使用
安装Docker
一键安装脚本
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
sudo systemctl enable docker
sudo systemctl start docker
docker version
if [ $? -eq 0 ];then
echo "docker successful installation!"
fi
# 添加国内镜像
touch /etc/docker/daemon.json
echo "{
"registry-mirrors": [
"http://hub-mirror.c.163.com"
]
}" > /etc/docker/daemon.json
sudo systemctl daemon-reload
sudo systemctl restart docker
Dockerfile 自定义镜像
Dockerfile 是一个文本文件,用来描述如何从一个基础镜像(例如 ubuntu 或 alpine)构建出一个新的镜像,包括安装依赖、复制文件、设置环境变量、暴露端口等操作。使用 Dockerfile 可以让开发者清晰地记录应用程序的配置和依赖,以及保证应用程序在不同的环境中运行的一致性。
# 基于官方 Tomcat 8 镜像构建自定义镜像
FROM tomcat:8
# 将本地的 webapp 目录复制到 Tomcat 默认的 webapps 目录下
COPY ./webapp /usr/local/tomcat/webapps/ROOT
# 安装 Nginx
RUN apt-get update && \
apt-get install -y nginx
# 配置 Nginx
COPY ./nginx.conf /etc/nginx/nginx.conf
# 设置工作目录
WORKDIR /var/www/html
# 运行 Nginx
CMD ["nginx", "-g", "daemon off;"]
- 构建镜像
docker build -t my-tomcat-nginx .
- 运行构建好的镜像
docker run -p 8005:80 my-tomcat-nginx
镜像管理
1 构建Docker镜像
- 与
Dockerfile相同的目录中运行以下命令
docker build -t tomcat-nginx-app:v1 .
- . 表示用当前目录的
Dockerfile文件来构建 - tomcat-nginx-app:v1 表示镜像名称(
REPOSITORY)以及版本(TAG)
docker images
- 创建成功之后使用
Docker images来查看镜像
2 保存镜像到本地磁盘
- 初步操作构建好之后,可能会更改镜像,却又怕源镜像丢失
docker save -o tomcat_nginx.tar my-tomcat-nginx:v1
- 本地文件名为
tomcat_nginx.tar文件
- 如果是运行中的容器,进行打包,需要使用下面的命令
docker export -o tomcat_nginx2.tar 47147b60cf36
- container_id 可以通过
docker ps查看,第一列就是
- 还原到本地仓库
docker load < tomcat_nginx.tar
3 给Docker镜像打标签
docker tag <镜像 ID 或 镜像名称> robertchao/tomcat8-nginx-app:v1
docker tag 99f200a0f7f1 robertchao/tomcat8-nginx-app:v1
- 完成之后,使用
Docker images来查看镜像。
4 将镜像推送到 Docker Hub
- 前提是需要有 Docker Hub 账户。如果您还没有账户,请创建一个。
docker login
- 在推送到 Docker Hub 之前,需要使用 Docker Hub 用户名给镜像打标签。
docker tag <镜像 ID 或镜像名称> robertchao/tomcat-jdk8-app:v1
- 推送镜像
docker push robertchao/tomcat-jdk8-app:v1
5 下载指定名称的镜像
docker pull <镜像名称>
docker pull tomcat
6 使用Docker镜像运行容器
docker run -d -p <对外访问的端口>:<应用程序运行的端口> <镜像名称>
-d:用于以分离模式运行容器
-p:用于指定端口
例如:docker run -d -p 8080:8080 tomcat
7 删除镜像
- 删除所有未使用的镜像 (慎用)
docker image prune
docker image prune -a
7.1 使用 ID 删除镜像
- 获取镜像 ID
docker images -a -q
- 根据 ID 删除所有镜像
docker rmi $(docker images -a -q)
- 使用
-f标志来强制删除
docker rmi -f $(docker images -a -q)
7.2 删除特定的Docker镜像
- 获取镜像的 ID
docker images -a -q tomcat
7a2f1e6fcdd3
- 删除此镜像
docker rmi -f $(docker images -a -q tomcat)
8 删除容器
- 停止特定的容器
docker stop <容器 ID>
- 删除指定的容器
docker rm <容器 ID>
- 删除所有已停止的容器
docker container prune
9 将本地文件内容拷贝到容器
docker cp a.py container_id:/dir
- 命令:
docker cp - 宿主机文件:
a.py,路径是当前目录 - 容器文件夹:
container_id:/dir,拷贝到container_id的/dir文件夹下
Docker Compose简化部署
docker-compose是一个工具,可以让开发者使用一个 YAML 文件(通常命名为docker-compose.yml)来描述多个容器之间的配置,包括镜像、端口、环境变量、挂载卷、网络等。使用docker-compose可以让开发者一次性地启动或停止所有相关的容器,以及方便地管理容器之间的通信。
- 使用
docker-compose来定义和运行多个容器之间的依赖和协作关系,减少多个容器运行docker run命令的繁琐和出错率
version: '1'
services:
hsm-api:
image: tomcat-nginx-jdk8
container_name: socket_mina
volumes:
- /etc/localtime:/etc/localtime
- /home/logs:/home/logs
- /opt/pro/upload:/opt/pro/upload
restart: always
command: java -Xms512m -Xmx512m -Duser.timezone=GMT+8 -Dfile.encoding=utf-8 -jar /home/app/socker_mina.jar
ports:
- "80:8659"
environment:
- TZ=Asia/Shanghai
- LOG_PATH_PREFIX=/home/logs
- UPLOAD_DIR=/opt/pro/upload
network_mode: "zentaonet"
# 依赖于redis和mysql,在启动本服务之前会先启动依赖的服务
depends_on:
- redis
- mysql
Docker Compose语法和配置选项解释
- 版本(version):
Docker Compose文件的版本,用于指定使用哪个版本的语法。 - 服务(services) :用于定义各个服务的配置。每个服务都是一个独立的容器。
-
-
context:构建上下文路径,表示构建时查找
Dockerfile文件的位置。 [一般省略] -
dockerfile:指定使用的
Dockerfile文件名。默认为Dockerfile。 [一般省略] -
image:指定要使用的镜像名称。可以是公共镜像(例如
nginx、mysql等),也可以是本地构建的私有镜像。 -
build:用于指定构建镜像所需的
Dockerfile的路径。可以是相对于Docker Compose文件的相对路径,或者是包含Git URL的完整路径。 -
ports:定义容器和主机之间的端口映射关系。可以是单个端口,也可以是一个范围。格式为
[主机端口]:[容器端口]。ports: - "8080:80"表示将容器内的 80 端口映射到主机的 8080 端口。- 多端口映射,使用
-表示集合
-
volumes:定义容器和主机之间的文件卷绑定关系。格式为
[主机路径]:[容器路径],可以指定只读或可写。例如,volumes: - "./data:/app/data:ro"表示将主机上的./data目录挂载到容器内的/app/data路径,并以只读方式访问。 -
environment:设置容器中的环境变量。可以是一个键值对或一个列表。例如,
environment: - MYSQL_ROOT_PASSWORD=mysecretpassword设置了一个名为MYSQL_ROOT_PASSWORD值为mysecretpassword的环境变量。 -
depends_on:指定服务之间的依赖关系。例如,
depends_on: - db表示该服务依赖于名为db的服务,在启动时会先启动db服务。 -
command:定义容器启动时要执行的命令。例如,
command: bundle exec rails server表示在容器启动时执行bundle exec rails server命令。
-
- 网络(networks) :用于定义网络配置。
-
- driver:指定网络使用的驱动程序。常见的驱动程序有
bridge、overlay、macvlan等。 - driver_opts:用于指定特定驱动程序的选项。例如,
driver_opts: myoption: value可以设置自定义选项。
- driver:指定网络使用的驱动程序。常见的驱动程序有
- 数据卷(volumes) :用于创建和管理数据卷。
-
- external:指定数据卷是否为外部数据卷,意味着数据卷由外部创建和管理。
- 命令(command) :定义容器启动时要执行的命令。
- 链接(links) :定义服务之间的链接关系,使一个服务可以通过名称引用另一个服务
Docker Compose 命令
-
启动应用(up)
-d选项,用于后台运行应用程序
docker-compose up -d
-
停止应用(down)
- 删除所有:停止容器,移除网络,删除容器
docker-compose down
- 停止服务(stop)
docker-compose stop
- 启动服务(start)
docker-compose start
- 查看服务状态(ps)
docker-compose ps
- 构建镜像(build)
docker-compose build
-
查看日志(logs)
-f参数来保持日志的跟踪
docker-compose logs -300f