基本使用
$ sudo apt update$ curl -fsSL https://get.docker.com -o get-docker.sh$ sudo sh get-docker.sh$ docker --version# 从仓库下载镜像$ 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$ sudo vim /etc/docker/daemon.json{ "registry-mirrors": [ "https://docker.m.daocloud.io", "https://docker.1panel.live", "https://hub.rat.dev" ]}
$ sudo service docker restartNetworking
Section titled “Networking”默认是 Bridge 桥接模式
# 查看网络列表$ sudo docker network list
# 删除自定义的子网$ sudo docker network rm b286e035Bridge
Section titled “Bridge”# 创建子网# 同一子网下的容器之间可以相互访问$ 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-netmongo
$ 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/shping my_mongodbHost 模式下 Docker 共享宿主机的网络空间
$ sudo docker run -d --network host nginx
# 进入容器,查看IP$ sudo docker exec -it my-nginx /bin/shapt update
apt install iproute2
ip addr show容器与宿主机间不联网
Dockerfile
Section titled “Dockerfile”# 设置目录# 复制当前目录下的文件到/app目录下$ vim DockerfileFROM 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_appDocker Hub
Section titled “Docker Hub”$ sudo docker login
$ sudo docker build -t username/express_app .
$ sudo docker push username/express_appDocker Compose
Section titled “Docker Compose”$ sudo docker compose version
$ mkdir mongodb-express
$ cd mongodb-express
$ vim docker-compose.yamlservices: 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 startDocker 利用了 Linux 内核的两大原生功能实现容器化。
- Cgroups 用来限制和隔离进程的资源使用,可以为每个容器设置 CPU、内存、网络带宽等资源的使用上限,确保一个容器的资源消耗不会影响到宿主机或其他容器
- Namespaces 用来隔离进程的资源视图,使得容器只能看到自己内部的进程 ID、网络资源和文件目录,所以容器本质上还是一个特殊的进程