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流程中,实现了自动化构建和部署。
共同学习,写下你的评论
评论加载中...
作者其他优质文章