Skip to content

基本使用

Terminal window
$ sudo apt update
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ docker --version
Terminal window
# 从仓库下载镜像
$ sudo docker pull postgres:13-alpine
# 下载指定CPU架构的镜像
$ sudo docker pull --platform=linux/arm64 nginx
# 列出下载过的镜像
$ sudo docker images
# 删除镜像
$ sudo docker rmi 1e5f3c5b
# 下载镜像并运行容器
$ sudo docker run nginx
# 启动并后台运行容器
# 宿主机端口80:容器内端口80
# 宿主机目录:容器内目录(绑定挂载)
# 容器停止时总是重启/unless-stopped手动停止的容器不会尝试重启
# 自定义容器名
$ sudo docker run -p 80:80 -v /website/html:/html -d --restart always --name my_nginx nginx
# 使用已创建的挂载卷
$ sudo docker run -p 80:80 -v nginx_html:/html -d nginx
# 传入环境变量
$ sudo docker run -d \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=password \
mongo
# 打开容器的控制台
# 当容器停止时删除容器
$ sudo docker run -it --rm alpine
# 只创建容器,启动用start
$ sudo docker create -p 27017:27017 mongo
# 查看正在运行的容器
$ sudo docker ps
# 查看容器列表,包括正在运行和已经停止的
$ sudo docker ps -a
# 查看容器详细信息
$ sudo docker inspect 1e5f3c5b
# 进入容器内部
$ sudo docker exec -it 1e5f3c5b /bin/sh
# 在容器内部执行Linux命令
$ sudo docker exec 1e5f3c5b ps -ef
# 重启被停止的容器
$ sudo docker start 1e5f3c5b
# 查看容器日志
$ sudo docker logs 1e5f3c5b
# 查看容器实时日志
$ sudo docker logs 1e5f3c5b -f
# 停止正在运行的容器
$ sudo docker stop 1e5f3c5b
# 删除正在运行的容器
$ sudo docker rm -f 1e5f3c5b
# 创建挂载卷
$ sudo docker volume create nginx_html
# 查看宿主机下挂载卷的路径
$ sudo docker volume inspect nginx_html
# 查看挂载卷列表
$ sudo docker volume list
# 删除挂载卷
$ sudo docker volume rm nginx_html
# 删除容器未在使用的挂载卷
$ sudo docker volume prune -a
Terminal window
$ sudo vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1panel.live",
"https://hub.rat.dev"
]
}
$ sudo service docker restart

默认是 Bridge 桥接模式

Terminal window
# 查看网络列表
$ sudo docker network list
# 删除自定义的子网
$ sudo docker network rm b286e035
Terminal window
# 创建子网
# 同一子网下的容器之间可以相互访问
$ sudo docker network create my-net
$ sudo docker run -d \
--name=my_mongodb
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=admin \
-e MONGO_INITDB_ROOT_PASSWORD=password \
--network=my-net
mongo
$ sudo docker run -d \
--name my-mongo-express \
-p 8081:8081 \
-e ME_CONFIG_MONGODB_SERVER="my_mongodb" \
-e ME_CONFIG_MONGODB_ADMINUSERNAME="admin" \
-e ME_CONFIG_MONGODB_ADMINPASSWORD="password" \
--network my-net \
mongo-express
$ sudo docker exec -it my-mongo-express /bin/sh
ping my_mongodb

Host 模式下 Docker 共享宿主机的网络空间

Terminal window
$ sudo docker run -d --network host nginx
# 进入容器,查看IP
$ sudo docker exec -it my-nginx /bin/sh
apt update
apt install iproute2
ip addr show

容器与宿主机间不联网

Terminal window
# 设置目录
# 复制当前目录下的文件到/app目录下
$ vim Dockerfile
FROM node:slim
WORKDIR /app
COPY . .
RUN pnpm install
EXPOSE 3000
CMD ["pm2","index.ts"]
# 在当前目录下构建构建镜像
$ sudo docker build -t express_app .
# 启动容器
$ sudo docker run -d -p 3000:3000 express_app
Terminal window
$ sudo docker login
$ sudo docker build -t username/express_app .
$ sudo docker push username/express_app
Terminal window
$ sudo docker compose version
$ mkdir mongodb-express
$ cd mongodb-express
$ vim docker-compose.yaml
services:
web:
image: mongo-express
ports:
- 8081:8081
environment:
- ME_CONFIG_MONGODB_SERVER: db
- ME_CONFIG_MONGODB_ADMINUSERNAME: admin
- ME_CONFIG_MONGODB_ADMINPASSWORD: password
depends_on:
- db
db:
image: mongo
restart: always
environment:
- MONGO_INITDB_ROOT_USERNAME: admin
- MONGO_INITDB_ROOT_PASSWORD: password
volumes:
- /home/data/db:/data/db
# 启动
$ sudo docker compose up -d
# 启动并指定文件名
$ sudo docker compose -f compose.yaml up -d
# 停止并删除容器
$ sudo docker compose down
$ sudo docker ps -a
# 停止容器
$ sudo docker compose stop
$ sudo docker compose start

Docker 利用了 Linux 内核的两大原生功能实现容器化。

  • Cgroups 用来限制和隔离进程的资源使用,可以为每个容器设置 CPU、内存、网络带宽等资源的使用上限,确保一个容器的资源消耗不会影响到宿主机或其他容器
  • Namespaces 用来隔离进程的资源视图,使得容器只能看到自己内部的进程 ID、网络资源和文件目录,所以容器本质上还是一个特殊的进程