Docker学习涵盖了从安装到基本操作的全面指南,包括Docker的优势、应用场景以及如何构建和管理容器和镜像。文章还详细介绍了Docker的网络与存储配置,以及通过实践案例帮助读者理解如何使用Docker部署Web应用和多容器应用。
Docker学习:新手入门完全指南 Docker简介与安装什么是Docker
Docker 是一种开源的应用容器引擎,它可以让开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,几乎不需要进行任何修改。Docker使用客户端-服务器架构,用户通过命令行工具(Docker CLI)或编程接口(Docker API)与Docker守护进程(Docker Daemon)交互。
Docker的核心概念包括镜像(Image)、容器(Container)、仓库(Repository)等:
- 镜像(Image):Docker镜像是一个只读模板,包含运行应用所需的一切代码、库和资源。
- 容器(Container):容器是镜像的运行实例。容器是隔离的,拥有自己独立的文件系统,同时容器之间可以共享主机系统资源。
- 仓库(Repository):仓库是集中存放镜像的场所,可以理解为代码控制中心。可以分为公开和私有仓库,开发者可以将自己的镜像上传到仓库,供他人下载使用。
Docker的优势与应用场景
Docker 的优势主要体现在以下几个方面:
- 轻量级:Docker 容器不需要虚拟机上的额外操作系统,因此资源占用较少。
- 可移植性:Docker 在任何地方运行的行为都是一致的,可用于不同的开发环境。
- 快速启动:启动一个Docker容器只需几秒钟。
- 版本控制:Docker 提供了清晰的镜像版本管理。
- 依赖管理:Docker 可以将应用与依赖打包在一起,解决了运行环境一致性的问题。
- 自动化部署:Docker 可以将应用程序打包成容器,通过CI/CD流程自动化部署到生产环境。
Docker的应用场景广泛,包括Web应用部署、数据库、开发测试环境、微服务架构等。
Docker的安装步骤及环境配置
安装Docker
-
安装前准备:确保系统已更新到最新状态。以Ubuntu为例,执行以下命令:
sudo apt update sudo apt install -y apt-transport-https ca-certificates curl software-properties-common -
安装Docker:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh -
加入Docker组:为了方便使用Docker而不需要使用
sudo,可以将当前用户添加到docker组:sudo usermod -aG docker $USER -
重启电脑:为了使用户组更改生效,重启系统。
- 验证安装:运行以下命令验证安装是否成功:
docker --version
配置Docker
Docker的配置主要通过Docker的配置文件/etc/docker/daemon.json来完成。以下是一个示例配置文件:
{
"max-concurrent-downloads": 10,
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["localhost:5000"],
"debug": true,
"tls": true,
"tlscacert": "/etc/docker/ca.pem",
"tlscert": "/etc/docker/server-cert.pem",
"tlskey": "/etc/docker/server-key.pem",
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"]
}
配置文件中的每个键都有不同的意义,例如max-concurrent-downloads设置最大并发下载数,log-opts设置日志的最大大小和文件数量,registry-mirrors设置国内镜像源以加速镜像的下载。
容器与镜像的概念
镜像(Image)
镜像是构建容器的基础,可以认为是一个只读的模板。镜像包含了一个应用及其依赖的所有文件和配置。Docker Hub 上有很多公开的镜像,例如ubuntu、nginx、mysql等。
容器(Container)
容器是镜像的运行实例。通过docker run命令可以基于镜像启动一个容器。容器是轻量级的,可以被创建、启动、停止、删除,并且可以共享宿主机的资源。
Dockerfile的编写与解释
Dockerfile 是用来定义镜像内容的文本文件。Dockerfile 文件包含了一系列构建镜像的指令,这些指令执行结果由Docker构建工具解释。
以下是一个简单的Dockerfile示例,用于构建一个包含Python环境的镜像:
# 使用官方的Python基础镜像
FROM python:3.7-slim
# 设置工作目录
WORKDIR /app
# 复制当前目录的内容到容器中的/app
COPY . /app
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 设置环境变量
ENV NAME World
# 运行应用
CMD ["python", "app.py"]
解释:
FROM python:3.7-slim:指定基础镜像为Python 3.7 slim版本。WORKDIR /app:设置工作目录。COPY . /app:将当前目录的文件复制到容器的/app目录下。RUN pip install --no-cache-dir -r requirements.txt:安装应用依赖。ENV NAME World:设置环境变量。CMD ["python", "app.py"]:运行应用的指令。
Docker仓库的使用
Docker仓库是存放Docker镜像的地方,分为公共仓库和私有仓库。公共仓库如Docker Hub,私有仓库可以是企业内部构建的。以下是推送和拉取镜像的具体步骤:
推送镜像到Docker Hub
-
登录Docker Hub:
docker login --username=your_username --password=your_password -
标记镜像:
docker tag my_image your_username/my_image:tag -
推送镜像:
docker push your_username/my_image:tag - 创建并使用私有仓库:以下是一个创建私有仓库的示例,首先需要安装并配置一个私有仓库,例如使用Docker Registry:
docker run -d -p 5000:5000 --restart=always --name registry registry:2然后将镜像推送到私有仓库:
docker tag my_image localhost:5000/my_image:tag docker push localhost:5000/my_image:tag
从Docker Hub拉取镜像
-
拉取镜像:
docker pull ubuntu:latest - 运行容器:
docker run -it ubuntu:latest /bin/bash
启动、停止与删除容器
启动容器
使用docker run命令启动一个容器,示例如下:
docker run -it --name my_container ubuntu:latest /bin/bash
在上面的命令中,-it表示以交互方式运行容器,--name指定容器名称,ubuntu:latest是使用的镜像,/bin/bash是容器启动时执行的命令。
停止容器
停止运行中的容器,可以使用docker stop命令:
docker stop my_container
此命令会发送一个终止信号给容器,等待容器退出后才停止。
删除容器
删除容器使用docker rm命令:
docker rm my_container
如果容器正在运行,需要先停止,然后才能删除:
docker rm -f my_container
-f表示强制删除运行中的容器。
查看容器状态与历史记录
查看容器状态
使用docker ps查看正在运行的容器:
docker ps
使用docker ps -a查看所有容器(包括已经停止的):
docker ps -a
查看容器日志
查看容器的日志信息可以通过docker logs命令:
docker logs my_container
查看容器历史记录
查看容器的运行历史,可以使用docker history命令:
docker history ubuntu:latest
此命令显示构建该镜像的指令。
容器内操作命令
在容器中安装软件、配置服务等操作与普通的Linux系统操作一致。例如,在容器中安装Python并运行一个简单的Python脚本:
-
启动容器:
docker run -it --name my_container ubuntu:latest /bin/bash -
更新apt包列表:
apt-get update -
安装Python:
apt-get install -y python3 - 运行Python脚本:
python3 -c "print('Hello World')"
构建与保存镜像
构建镜像
使用docker build命令可以根据Dockerfile构建新的镜像:
docker build -t my_image:tag .
-t参数用来指定镜像的标签(名称与版本号),.表示从当前目录读取Dockerfile文件。
保存镜像
可以使用docker save命令将镜像保存为tar文件:
docker save -o my_image.tar my_image:tag
-o参数用来指定输出文件的路径。
镜像的推送与拉取
推送镜像
推送镜像到Docker Hub的过程已经在Docker仓库的使用部分详细讲解。
拉取镜像
使用docker pull命令从Docker Hub拉取镜像:
docker pull my_image:tag
镜像的标签与版本管理
标签管理
镜像是通过标签(Tag)来区分不同版本的。可以通过以下命令查看镜像的所有标签:
docker images
使用docker tag命令为镜像添加新标签:
docker tag my_image:tag my_image:new_tag
版本管理
通过为镜像添加不同的标签,可以实现版本管理。例如:
docker tag my_image:latest my_image:1.0
docker tag my_image:latest my_image:2.0
每种标签都代表不同版本的镜像。要从不同标签中回退到旧版本,可以使用docker tag命令将旧版本镜像重新标记为当前版本。
容器网络配置与连接
Docker容器默认使用Docker桥接网络,也可以自定义网络。
使用Docker桥接网络
在默认网络模式下,每个容器都会被分配一个IP地址,并且可以相互通信。
自定义网络
创建自定义网络,可以通过docker network命令:
docker network create my_network
将容器连接到自定义网络:
docker run -it --name my_container --network my_network ubuntu:latest /bin/bash
Docker桥接网络与自定义网络
Docker桥接网络
当创建容器时,如果没有指定网络,Docker会自动将其连接到Docker所维护的默认网络(通常是docker0)。
自定义网络
自定义网络可以提供更多的网络配置选项,例如使用不同的网络驱动(如overlay网络用于跨主机通信)。
创建自定义网络并使用:
docker network create --driver bridge my_bridge
docker run -it --network my_bridge --name my_container ubuntu:latest /bin/bash
容器存储卷的使用
存储卷是一种持久化存储的方式,它不依赖于容器的生命周期,即使容器被删除,存储卷中的数据仍然保留。
创建存储卷
创建一个新的存储卷:
docker volume create my_volume
将存储卷挂载到容器
将存储卷挂载到容器的某个目录:
docker run -v my_volume:/data -it --name my_container ubuntu:latest /bin/bash
在容器中创建一个文件,确保文件保存在挂载的存储卷上:
echo "Hello World" > /data/test.txt
启动一个新的容器,挂载同一个存储卷,验证数据是否完整:
docker run -v my_volume:/data -it --name my_container2 ubuntu:latest /bin/bash
cat /data/test.txt
复杂场景下的存储卷配置
可以配置存储卷以支持数据持久化和备份,例如使用docker volume ls命令列出所有存储卷,并使用docker volume rm命令删除不需要的存储卷。
构建简单的Web应用容器
假设要构建一个简单的Web应用容器,应用使用Flask框架。以下是完整的Dockerfile和应用代码:
准备Dockerfile
编写Dockerfile,如下:
# 使用官方的Python基础镜像
FROM python:3.7-slim
# 工作目录设置为 /app
WORKDIR /app
# 复制当前目录内容到容器的 /app
COPY . /app
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 设置环境变量
ENV NAME World
# 定义运行应用的命令
CMD ["python", "app.py"]
准备应用代码
在工作目录下,创建app.py文件:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
创建requirements.txt文件:
Flask==1.1.2
构建并运行容器
执行以下命令构建并运行容器:
docker build -t my_web_app .
docker run -p 5000:5000 -d my_web_app
访问http://localhost:5000,可以看到Web应用输出的"Hello World!"。
部署多容器应用
假设需要构建一个包含Web应用和MySQL数据库的多容器应用。
准备Dockerfile和docker-compose.yml
创建docker-compose.yml文件,配置多个容器:
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
links:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: exampledb
创建Dockerfile:
# 使用官方的Python基础镜像
FROM python:3.7-slim
# 工作目录设置为 /app
WORKDIR /app
# 复制当前目录内容到容器的 /app
COPY . /app
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 设置环境变量
ENV NAME World
# 定义运行应用的命令
CMD ["python", "app.py"]
构建和启动应用
使用以下命令启动应用:
docker-compose up -d
集成Docker到CI/CD流程
将Docker与CI/CD流程集成可以自动化构建、测试和部署流程。以GitHub Actions为例:
-
创建
.github/workflows/docker-ci.yml文件:name: Docker CI on: push: branches: - main pull_request: branches: - main jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build the Docker image run: docker build -t my_docker_image . - name: Login to the Docker registry uses: docker/build-push-action@v2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} registry: my-docker-registry.example.com tags: my_docker_image:latest -
配置Docker Hub或私有仓库的登录凭证:
- 在GitHub仓库的Settings -> Secrets中添加Docker Hub的用户名和密码。
- 推送镜像到仓库:
- 当推送代码到
main分支时,GitHub Actions会自动构建镜像并推送至指定的Docker仓库。
- 当推送代码到
通过上述步骤,成功将Docker集成到CI/CD流程中,实现了自动化构建和部署。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章