Docker学习记录

Docker学习记录

Docker常用的命令

  1. 显示Docker版本信息:

    1
    docker version
  2. 显示Docker系统信息:

    1
    docker info
  3. 拉取Docker镜像:

    1
    docker pull <image_name>:<tag>
  4. 列出本地已安装的镜像:

    1
    docker images
  5. 运行一个容器:

    1
    docker run <image_name>
  6. 列出正在运行的容器:

    1
    docker ps
  7. 列出所有容器(包括已停止的):

    1
    docker ps -a
  8. 停止一个容器:

    1
    docker stop <container_id>
  9. 启动一个已停止的容器:

    1
    docker start <container_id>
  10. 重启一个容器:

    1
    docker restart <container_id>
  11. 删除一个容器:

    1
    docker rm <container_id>
  12. 进入容器的交互式终端:

    1
    docker exec -it <container_id> /bin/bash
  13. 构建一个镜像:

    1
    docker build -t <image_name> <path_to_dockerfile>
  14. 删除一个镜像:

    1
    docker rmi <image_name>
  15. 查看容器日志:

    1
    docker logs <container_id>

使用Docker构建自己的镜像

先编写DockerFile

1
2
3
4
5
6
7
8
9
10
11
12
# 基础镜像使用java
FROM openjdk:8-jre
# 作者
MAINTAINER chengzc <chengzc@chinabidding.cn>
#设置时区
ENV TZ=Asia/Shanghai
# VOLUME 指定临时文件目录为/tmp 在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为xboot.jar
ADD admin-1.0-SNAPSHOT.jar xboot.jar
# 运行jar包
ENTRYPOINT [ "sh", "-c", "java -jar /xboot.jar"]

Build 为镜像(安装包)和运行

1
2
#编译 
docker build -t test:v1 .
  • docker build: 这是Docker命令的一部分,用于构建镜像。
  • -t test:v1: -t选项用于给构建的镜像指定一个标签(tag)。在这个例子中,镜像的名称是test,标签是v1。标签可以用来标识不同版本或变体的镜像。
  • .: 这是构建上下文路径(build context),表示Docker将在当前目录中查找Dockerfile和相关文件来构建镜像。Dockerfile是一个包含构建镜像指令的文本文件,它描述了如何构建镜像的步骤和配置。

综合起来,这个命令的作用是在当前目录中查找Dockerfile和相关文件,并使用它们来构建一个名为test,标签为v1的Docker镜像。

1
2
#运行 
docker run -p 8081:8080 --name test-hello test:v1
  • docker run: 这是Docker命令的一部分,用于运行容器。
  • -p 8081:8080: -p选项用于将容器的端口映射到主机的端口。在这个例子中,容器的端口是8080,主机的端口是8081,表示将容器的8080端口映射到主机的8081端口。这样可以通过主机的8081端口访问容器中运行的应用程序。
  • --name test-hello: --name选项用于给容器指定一个名称。在这个例子中,容器的名称是test-hello,可以根据需要进行修改。
  • test:v1: 这是要运行的镜像的名称和标签。在这个例子中,镜像的名称是test,标签是v1。Docker将根据这个镜像创建并运行一个容器。

综合起来,这个命令的作用是使用名为test:v1的镜像创建并运行一个容器,将容器的8080端口映射到主机的8081端口,并给容器指定一个名称为test-hello

通过这个命令运行的容器将在主机的8081端口监听,并可以通过访问http://localhost:8081来访问容器中运行的应用程序(假设主机是本地主机)。

目录挂载

现存问题

  • 使用 Docker 运行后,我们改了项目代码不会立刻生效,需要重新build和run,很是麻烦。
  • 容器里面产生的数据,例如 log 文件,数据库备份文件,容器删除后就丢失了。

通过挂载方式,将运行目录映射到宿主机的目录,即可解决上述问题,如下:-v /path/on/host:/path/in/container表示将宿主机上的/path/on/host目录挂载到容器内的/path/in/container目录。你需要将/path/on/host替换为宿主机上的实际目录路径。

1
docker run -p 8081:8080 --name test-hello -v /path/on/host:/path/in/container test:v1

多容器通信

  1. 创建一个名为test-net的网络:
1
docker network create test-net
  1. 运行 Redis 在 test-net 网络中,别名redis
1
2
#注意后面再代码里面链接的话即可用redis://redis:6379方式代替localhost://redis:6379
docker run -d --name redis --network test-net --network-alias redis redis:latest
  1. 运行 Web 项目,使用同个网络
1
docker run -p 8080:8080 --name test -v D:/test:/app --network test-net -d test:v1

这个命令是在 Docker 中运行 Redis 容器的命令,并设置了一些选项和参数。下面是对每个部分的解释:

  • docker run: 运行容器的命令。
  • -d: 这是一个选项,表示以后台(detached)模式运行容器,即容器在后台运行而不会占用终端。
  • --name redis: 这是一个选项,用于指定容器的名称为 “redis”。通过指定名称,可以在后续的操作中使用容器名称来引用该容器。
  • --network test-net: 这是一个选项,用于将容器连接到名为 “test-net” 的网络。通过将容器连接到特定的网络,可以实现容器之间的通信。
  • --network-alias redis: 这是一个选项,用于为容器设置网络别名。在这个命令中,将容器的网络别名设置为 “redis”。这样,其他容器可以使用该别名来访问该容器。
  • redis:latest: 这是指定要运行的容器镜像的名称和标签。在这个命令中,使用的是名为 “redis” 的镜像,并指定标签为 “latest”,表示使用最新版本的 Redis 镜像。

综合起来,这个命令的作用是在后台运行一个名为 “redis” 的容器,将其连接到名为 “test-net” 的网络,并为容器设置了网络别名 “redis”。该容器使用 Redis 镜像的最新版本。

Docker-Compose

现存问题
在上面,我们运行了两个容器:Web 项目 + Redis
如果项目依赖更多的第三方软件,我们需要管理的容器就更加多,每个都要单独配置运行,指定网络。
这里,我们使用 docker-compose 把项目的多个服务集合到一起,一键运行。

安装Docker-Compose

  • 如果你是安装的桌面版 Docker,不需要额外安装,已经包含了。
  • 如果是没图形界面的服务器版 Docker,你需要单独安装 安装文档
  • 运行docker-compose检查是否安装成功

编写脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
version: "3.7"

services:
app:
build: ./
ports:
- 80:8080
volumes:
- ./:/app
environment:
- TZ=Asia/Shanghai
redis:
image: redis:5.0.13
volumes:
- redis:/data
environment:
- TZ=Asia/Shanghai

volumes:
redis:

这是一个使用 Docker Compose 编排多个服务的配置文件。下面是对每个部分的解释:

1
version: "3.7"

这部分定义了两个服务:appredis。每个服务都有自己的配置项。

  • app 服务:

    • build: ./:使用当前目录中的 Dockerfile 构建镜像。
    • ports: - 80:8080:将主机的 80 端口映射到容器的 8080 端口。
    • volumes: - ./:/app:将当前目录挂载到容器的 /app 目录,实现主机和容器之间的文件共享。
    • environment: - TZ=Asia/Shanghai:设置容器的环境变量 TZAsia/Shanghai,用于指定容器的时区。
  • redis 服务:

    • image: redis:5.0.13:使用 Redis 5.0.13 版本的镜像。
    • volumes: - redis:/data:将名为 redis 的卷挂载到容器的 /data 目录,用于持久化存储 Redis 数据。
    • environment: - TZ=Asia/Shanghai:设置容器的环境变量 TZAsia/Shanghai,用于指定容器的时区。
1
2
volumes:
redis:

这部分定义了一个名为 redis 的卷,用于持久化存储 Redis 数据。

通过这个 Docker Compose 配置文件,可以同时运行一个名为 app 的应用服务和一个名为 redis 的 Redis 服务,并进行端口映射、文件共享和环境变量设置等配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#在后台运行只需要加一个 -d 参数
docker-compose up -d
#查看运行状态:
docker-compose ps
#停止运行:
docker-compose stop
#重启:
docker-compose restart
#重启单个服务:
docker-compose restart service-name
#进入容器命令行:
docker-compose exec service-name sh
#查看容器运行log
docker-compose logs [service-name]

发布和部署

DockerHub注册账号
创建镜像库

命令行登录账号

1
docker login -u username

新建一个tag,名字和构建的镜像保持一致

1
docker tag test:v1 username/test:v1

推上去

1
docker push username/test:v1

部署试下

1
docker run -dp 8080:8080 username/test:v1