本文全面介绍了Docker的基础概念和应用,包括Docker的定义、主要特点以及与虚拟机的区别。文中详细讲解了Docker的安装步骤、环境配置以及如何管理镜像和容器。此外,还探讨了Docker的网络与存储配置,以及最佳实践和持续集成部署策略。
Docker 是一个开源的应用容器引擎,它让开发者可以将应用及其依赖关系打包到一个可移植的容器中,并发布到任何安装了 Docker 引擎的操作系统上。容器使用沙箱机制,相互之间不会有任何接口。
Docker 具有以下主要特点:
Docker 与虚拟机的主要区别在于它们的运行方式和资源利用率:
Docker 的安装步骤根据操作系统的不同而有所差异。以下以 Ubuntu 和 MacOS 为例。
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
Docker 安装完成后,需要进行一些基本的环境配置:
~/.bashrc
或 ~/.zshrc
文件,添加以下内容:
export PATH=/usr/local/bin:$PATH
source ~/.bashrc
/etc/docker/daemon.json
文件,添加以下内容:
{ "registry-mirrors": ["https://registry.docker-cn.com"] }
sudo systemctl restart docker
可以通过以下命令验证 Docker 是否安装成功:
docker --version
输出信息如下:
Docker version 20.10.0, build 773c5f3
如果输出版本信息,说明 Docker 安装成功。
Docker镜像是构建容器的基础,它是包含所有依赖库和配置的应用程序模板。每个镜像定义了一个容器的运行环境,包括文件系统、环境变量和执行指令等。
Docker Hub 是 Docker 官方提供的镜像仓库,用户可以从这里下载官方和社区维护的镜像。
docker pull ubuntu
docker pull ubuntu:18.04
通过 Dockerfile 来构建自己的镜像:
Dockerfile
文件:
FROM ubuntu:18.04 RUN apt-get update RUN apt-get install -y python3 CMD ["python3", "-m", "http.server"]
Dockerfile
构建镜像:
docker build -t my-python-app .
释放磁盘空间可以删除不再需要的镜像:
docker images
docker rmi <image-id>
docker image prune
通过运行镜像来启动容器:
docker run -it ubuntu bash
docker run -d ubuntu /bin/bash
docker run -e MY_VAR=value ubuntu bash
进入正在运行的容器,可以进行交互操作:
docker ps
docker exec -it <container-id> /bin/bash
停止和删除容器,管理容器生命周期:
docker stop <container-id>
docker rm <container-id>
docker container prune
docker container prune -f
查看容器的状态,了解容器运行情况:
docker ps -a
docker logs <container-id>
docker top <container-id>
Docker 支持多种网络模式,包括桥接网络和主机网络等。
docker network create my_bridge_network
docker run --network my_bridge_network -it ubuntu bash
数据卷提供持久化存储,不依赖于容器生命周期。
docker volume create my_volume
docker volume ls
docker run -v my_volume:/app ubuntu bash
容器间通信可以通过网络配置和数据卷来实现。
docker run --name my_web_container --network my_bridge_network -it nginx bash docker run --name my_db_container --network my_bridge_network -it mysql bash
docker exec -it my_web_container ping my_db_container
共享数据卷可以实现容器间数据同步。
docker run -v /host/path:/container/path -it ubuntu bash
docker cp /host/path/file.txt my_container:/container/path/file.txt
Dockerfile 是构建镜像的脚本,以下是一些编写技巧:
多阶段构建:
FROM golang:1.13 AS builder WORKDIR /app COPY . /app RUN go build -o app . FROM alpine COPY --from=builder /app/app /app CMD ["/app"]
ARG MY_VAR=unspecified ENV MY_ENV_VAR=specified
安全使用 Docker 是非常重要的,以下是一些建议:
FROM ubuntu:18.04 RUN useradd -u 1000 -s /bin/false myuser USER myuser
FROM ubuntu:18.04 RUN echo 'cgroup_enable=memory swapaccount=1' > /etc/default/grub RUN update-grub ENV DOCKER_DEFAULT_RUNTIME=runc ENV DOCKER_DEFAULT_CGROUP=systemd
Docker Compose 提供了一种定义和运行多容器应用的方式,通过一个 docker-compose.yml
文件来配置应用的多个服务。
docker-compose.yml
文件:
version: '3' services: web: build: ./web ports: - "5000:5000" db: build: ./db volumes: - db_data:/var/lib/mysql volumes: db_data:
docker-compose up
docker-compose down
持续集成与部署(CI/CD)是现代软件开发的重要组成部分,通过自动化测试和部署流程提高开发效率。
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Build Docker Image run: docker build -t myapp . - name: Push Docker Image run: docker push myapp