在当今的云计算和DevOps领域,Docker已经成为容器技术的代名词。作为一个开源的容器化平台,Docker通过操作系统级虚拟化技术,将应用程序及其所有依赖项打包到一个标准化的单元中,这个单元就是我们所说的容器。与传统的虚拟机相比,Docker容器更加轻量级、启动更快、资源占用更少,同时保持了良好的隔离性。
Docker生态系统的核心组件包括:
在安装Docker之前,首先需要确认你的系统满足以下基本要求:
对于Linux系统:
对于Windows系统:
对于macOS系统:
在Linux系统上,建议先更新系统软件包:
bash复制sudo apt-get update && sudo apt-get upgrade -y # 对于Debian/Ubuntu
sudo yum update -y # 对于CentOS/RHEL
对于Windows和macOS用户,建议关闭可能冲突的安全软件,并确保系统有足够的磁盘空间(至少20GB可用空间)。
bash复制sudo apt-get remove docker docker-engine docker.io containerd runc
bash复制sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
bash复制curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
bash复制echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
bash复制sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
bash复制sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
bash复制sudo yum install -y yum-utils
bash复制sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
bash复制sudo yum install -y docker-ce docker-ce-cli containerd.io
下载Docker Desktop安装程序:
运行安装程序:
启用WSL 2后端(推荐):
wsl --set-default-version 2启动Docker Desktop:
下载Docker Desktop for Mac:
安装Docker:
首次运行:
安装完成后,可以通过以下命令验证Docker是否安装成功:
bash复制docker --version
docker run hello-world
如果看到Docker版本信息和"Hello from Docker!"消息,说明安装成功。
默认情况下,Docker需要root权限。为了让普通用户也能运行Docker命令:
bash复制sudo groupadd docker
bash复制sudo usermod -aG docker $USER
bash复制newgrp docker
为了加快镜像下载速度,可以配置国内镜像源:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
EOF
bash复制sudo systemctl restart docker
bash复制docker run -it ubuntu bash
bash复制docker ps
bash复制docker ps -a
bash复制docker stop <container_id>
bash复制docker start <container_id>
bash复制docker rm <container_id>
bash复制docker pull ubuntu:20.04
bash复制docker images
bash复制docker rmi <image_id>
bash复制docker build -t my-image .
bash复制docker volume create my-vol
bash复制docker volume ls
bash复制docker run -d --name devtest -v my-vol:/app nginx:latest
bash复制docker network ls
bash复制docker network create my-net
bash复制docker network connect my-net my-container
对于Linux系统:
bash复制sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
yaml复制version: '3'
services:
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
bash复制docker-compose up -d
bash复制docker-compose down
bash复制docker-compose ps
bash复制docker run -u 1000 my-image
bash复制docker run -it --cpus=".5" --memory="512m" ubuntu
bash复制docker run --read-only -it alpine sh
bash复制docker logs <container_id>
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
bash复制docker stats
bash复制docker system prune
bash复制docker system df
问题1:在Linux上安装后无法启动Docker服务
解决方案:
uname -r(需≥3.10)journalctl -u docker.service问题2:Windows/macOS安装后Docker无法启动
解决方案:
问题1:容器无法访问外部网络
解决方案:
docker run --dns 8.8.8.8docker network inspect bridge问题2:磁盘空间不足
解决方案:
docker image prune -a问题1:容器性能下降
解决方案:
docker stats问题2:镜像拉取速度慢
解决方案:
使用Docker Swarm创建集群:
bash复制docker swarm init --advertise-addr <MANAGER-IP>
bash复制docker swarm join --token <TOKEN> <MANAGER-IP>:2377
bash复制docker service create --replicas 3 -p 80:80 --name nginx nginx:latest
在Jenkins中集成Docker:
groovy复制pipeline {
agent {
docker { image 'maven:3.8.1-openjdk-11' }
}
stages {
stage('Build') {
steps {
sh 'mvn clean package'
}
}
}
}
bash复制minikube start --driver=docker
bash复制kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=LoadBalancer
对于Linux系统:
bash复制sudo apt-get update && sudo apt-get upgrade docker-ce # Debian/Ubuntu
sudo yum update docker-ce # CentOS/RHEL
对于Windows/macOS:
注意:回滚可能导致数据兼容性问题,建议先备份重要数据
bash复制docker commit <container_id> backup-image
bash复制docker export <container_id> > container.tar
bash复制docker run --rm -v my-vol:/volume -v $(pwd):/backup alpine \
tar cvf /backup/backup.tar /volume
bash复制docker run --rm -v my-vol:/volume -v $(pwd):/backup alpine \
tar xvf /backup/backup.tar -C /volume --strip 1
bash复制sudo tar czvf docker-config-backup.tar.gz /etc/docker
bash复制docker save -o all-images.tar $(docker images -q)
bash复制docker run -it --net host --pid host --userns host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /etc:/etc:ro \
-v /usr/bin/docker-containerd:/usr/bin/docker-containerd:ro \
-v /usr/bin/docker-runc:/usr/bin/docker-runc:ro \
-v /lib/systemd/system:/lib/systemd/system:ro \
-v /var/lib:/var/lib:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--label docker_bench_security \
docker/docker-bench-security
bash复制docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image my-image
bash复制export DOCKER_CONTENT_TRUST=1
bash复制docker run -u 1000:1000 my-image
bash复制docker run --cap-drop all --cap-add NET_BIND_SERVICE nginx
dockerfile复制FROM maven AS build
WORKDIR /app
COPY . .
RUN mvn package
FROM openjdk:11-jre-slim
COPY --from=build /app/target/app.jar /app.jar
CMD ["java", "-jar", "/app.jar"]
bash复制docker run -it --cpus="1.5" --memory="1g" my-image
bash复制docker service create \
--name my-web \
--replicas 3 \
--update-delay 10s \
--update-parallelism 2 \
nginx:latest
bash复制docker service update \
--rollback \
my-web
bash复制kubectl create deployment nginx --image=nginx
bash复制kubectl expose deployment nginx --port=80 --type=LoadBalancer
bash复制kubectl scale deployment nginx --replicas=3
bash复制docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
bash复制docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 elasticsearch:7.9.3
docker run -d --name kibana --link elasticsearch:elasticsearch -p 5601:5601 kibana:7.9.3
docker run -d --name logstash --link elasticsearch:elasticsearch -v ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf logstash:7.9.3
bash复制docker run --log-driver=syslog --log-opt syslog-address=tcp://<logstash-ip>:5000 nginx
bash复制docker network create --driver=bridge --subnet=172.28.0.0/16 --ip-range=172.28.5.0/24 --gateway=172.28.5.254 my-net
bash复制docker run --network=my-net --ip=172.28.5.5 nginx
bash复制docker network create -d overlay my-overlay
bash复制docker service create --network=my-overlay --name my-service nginx
json复制{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
bash复制sudo systemctl restart docker
bash复制docker volume create --driver local \
--opt type=nfs \
--opt o=addr=<nfs-server-ip>,rw \
--opt device=:/path/on/nfs \
nfs-volume
bash复制docker run -it --rm -v nfs-volume:/data alpine sh
bash复制docker buildx create --name mybuilder --use
bash复制docker buildx build --platform linux/amd64,linux/arm64 -t my-image:latest --push .
bash复制docker pull my-image:latest
bash复制docker inspect --format='{{.Architecture}}' my-image:latest
示例workflow文件:
yaml复制name: CI/CD Pipeline
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build Docker image
run: docker build -t my-image .
- name: Login to Docker Hub
run: echo "${{ secrets.DOCKER_HUB_TOKEN }}" | docker login -u ${{ secrets.DOCKER_HUB_USERNAME }} --password-stdin
- name: Push Docker image
run: |
docker tag my-image ${{ secrets.DOCKER_HUB_USERNAME }}/my-image:latest
docker push ${{ secrets.DOCKER_HUB_USERNAME }}/my-image:latest
示例.gitlab-ci.yml:
yaml复制image: docker:stable
services:
- docker:dind
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_DRIVER: overlay2
stages:
- build
- deploy
build:
stage: build
script:
- docker build -t my-image .
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"
- docker tag my-image "$CI_REGISTRY_IMAGE:latest"
- docker push "$CI_REGISTRY_IMAGE:latest"