什么是Docker?
Docker把应用+依赖环境打包成一个”容器”,在任何安装了Docker的机器上都能运行。
简单理解:
- 传统部署:代码→服务器(环境配置麻烦)
- Docker部署:代码→打包成容器→任何服务器(零配置)
安装Docker
Ubuntu/Debian
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| apt update
apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update apt install -y docker-ce docker-ce-cli containerd.io
systemctl start docker systemctl enable docker
docker --version
|
CentOS/RHEL
1 2 3 4 5
| yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io systemctl start docker systemctl enable docker
|
Docker镜像和容器
镜像(Image):像安装包,只读的(如:nginx镜像)
容器(Container):镜像运行后的实例,可读写的(如:运行中的nginx)
常用命令
镜像操作
1 2 3 4 5 6 7 8 9 10 11 12 13
| docker search nginx
docker pull nginx:latest docker pull nginx:1.21
docker images
docker rmi nginx:latest docker rmi $(docker images -q)
|
容器操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| docker run nginx docker run -d nginx docker run -p 80:80 nginx docker run --name myweb nginx docker run --restart=always nginx
docker ps docker ps -a
docker stop 容器ID或名称 docker stop $(docker ps -q)
docker start 容器ID或名称
docker restart 容器ID或名称
docker rm 容器ID或名称 docker rm -f 容器ID或名称
|
容器进入和日志
1 2 3 4 5 6 7 8
| docker exec -it 容器ID /bin/bash docker exec -it 容器ID /bin/sh
docker logs 容器ID docker logs -f 容器ID docker logs --tail 100 容器ID
|
实战示例
示例1:运行Nginx服务器
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| docker run -d -p 80:80 --name nginx-server nginx
curl localhost:80
docker ps docker logs nginx-server
docker stop nginx-server docker rm nginx-server
|
示例2:运行MySQL数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| docker run -d \ --name mysql-server \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql:5.7
docker exec -it mysql-server mysql -uroot -p123456
docker stop mysql-server docker rm mysql-server
|
示例3:部署个人网站
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| mkdir -p /var/www/html echo "<h1>Hello Docker!</h1>" > /var/www/html/index.html
docker run -d \ --name mywebsite \ -p 80:80 \ -v /var/www/html:/usr/share/nginx/html \ nginx
echo "<h1>Updated!</h1>" > /var/www/html/index.html
|
端口映射
1 2 3 4 5
| docker run -p 主机端口:容器端口 镜像
docker run -p 8080:80 nginx docker run -p 3306:3306 mysql
|
数据持久化(挂载)
1 2 3 4 5 6 7 8 9 10
| docker run -v /宿主机路径:/容器路径 镜像
docker run -d -p 3306:3306 \ -v /data/mysql:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ mysql
|
查看资源使用
1 2 3 4 5
| docker stats
docker inspect 容器ID
|
常用技巧
技巧1:清理无用资源
1 2 3 4 5 6 7 8
| docker container prune
docker image prune
docker system prune -a
|
技巧2:导出和导入容器
1 2 3 4 5
| docker export 容器ID > container.tar
docker import container.tar new-image:tag
|
技巧3:复制文件
1 2 3 4 5
| docker cp 本地文件 容器ID:/容器路径
docker cp 容器ID:/容器路径 本地文件
|
常见问题
Q: 容器无法外网访问?
A: 检查端口映射 -p 参数 和防火墙。
Q: 容器重启后数据丢失?
A: 使用 -v 挂载到本地目录。
Q: 查看容器IP?
A: docker inspect 容器ID | grep IPAddress
Q: 如何修改容器?
A: 先docker commit 旧名称 新名称,再运行新镜像。不过推荐用Dockerfile重新构建。
总结
- Docker安装:Ubuntu安装命令,启动并enable
- 镜像:
pull拉取,images查看,rmi删除
- 容器:
run运行,ps查看,stop/start控制
- 常用参数:
-d后台,-p端口,-v挂载,--name起名
- 数据持久化用
-v挂载到主机
exec -it进入容器,logs查看日志
- 定期
docker system prune清理
下一篇:Docker Compose(多容器编排)。