Docker学习记录
Docker学习记录
ChengZCDocker学习记录
Docker常用的命令
显示Docker版本信息:
1
docker version
显示Docker系统信息:
1
docker info
拉取Docker镜像:
1
docker pull <image_name>:<tag>
列出本地已安装的镜像:
1
docker images
运行一个容器:
1
docker run <image_name>
列出正在运行的容器:
1
docker ps
列出所有容器(包括已停止的):
1
docker ps -a
停止一个容器:
1
docker stop <container_id>
启动一个已停止的容器:
1
docker start <container_id>
重启一个容器:
1
docker restart <container_id>
删除一个容器:
1
docker rm <container_id>
进入容器的交互式终端:
1
docker exec -it <container_id> /bin/bash
构建一个镜像:
1
docker build -t <image_name> <path_to_dockerfile>
删除一个镜像:
1
docker rmi <image_name>
查看容器日志:
1
docker logs <container_id>
使用Docker构建自己的镜像
先编写DockerFile
1 | 基础镜像使用java |
Build 为镜像(安装包)和运行
1 | 编译 |
docker build
: 这是Docker命令的一部分,用于构建镜像。-t test:v1
:-t
选项用于给构建的镜像指定一个标签(tag)。在这个例子中,镜像的名称是test
,标签是v1
。标签可以用来标识不同版本或变体的镜像。.
: 这是构建上下文路径(build context),表示Docker将在当前目录中查找Dockerfile和相关文件来构建镜像。Dockerfile是一个包含构建镜像指令的文本文件,它描述了如何构建镜像的步骤和配置。
综合起来,这个命令的作用是在当前目录中查找Dockerfile和相关文件,并使用它们来构建一个名为test
,标签为v1
的Docker镜像。
1 | 运行 |
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 |
多容器通信
- 创建一个名为test-net的网络:
1 | docker network create test-net |
- 运行 Redis 在 test-net 网络中,别名redis
1 | 注意后面再代码里面链接的话即可用redis://redis:6379方式代替localhost://redis:6379 |
- 运行 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 | version: "3.7" |
这是一个使用 Docker Compose 编排多个服务的配置文件。下面是对每个部分的解释:
1 | version: "3.7" |
这部分定义了两个服务:app
和 redis
。每个服务都有自己的配置项。
app
服务:build: ./
:使用当前目录中的 Dockerfile 构建镜像。ports: - 80:8080
:将主机的 80 端口映射到容器的 8080 端口。volumes: - ./:/app
:将当前目录挂载到容器的/app
目录,实现主机和容器之间的文件共享。environment: - TZ=Asia/Shanghai
:设置容器的环境变量TZ
为Asia/Shanghai
,用于指定容器的时区。
redis
服务:image: redis:5.0.13
:使用 Redis 5.0.13 版本的镜像。volumes: - redis:/data
:将名为redis
的卷挂载到容器的/data
目录,用于持久化存储 Redis 数据。environment: - TZ=Asia/Shanghai
:设置容器的环境变量TZ
为Asia/Shanghai
,用于指定容器的时区。
1 | volumes: |
这部分定义了一个名为 redis
的卷,用于持久化存储 Redis 数据。
通过这个 Docker Compose 配置文件,可以同时运行一个名为 app
的应用服务和一个名为 redis
的 Redis 服务,并进行端口映射、文件共享和环境变量设置等配置。
1 | 在后台运行只需要加一个 -d 参数 |
发布和部署
在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 |