Skip to content

Docker

记录docker容器的基本操作和镜像配置

安装

Windows平台下安装

例如:https://store.docker.com/editions/community/docker-ce-desktop-windows

Note

Win10的Docker CE需要开启Hyper-V,默认Docker会自动帮你开。一旦开启,Vitural Box会无法启用,只能关闭Hyper-V。因此,Dokcer CE和Vitural Box无法同时启动。Hyper-V在【windows功能】选择开启或关闭。

Linux平台下安装

bash
curl -sSL https://get.docker.com/ | sh # 需root

注意事项

manjaro无法使用这种方式安装,直接使用pacman安装即可

配置

需要阿里云加速器

注册登陆申请一个即可

https://zrv2x9z2.mirror.aliyuncs.com

linux下在/etc/docker/daemon.json输入以下配置

json
{
  "registry-mirrors":["https://zrv2x9z2.mirror.aliyuncs.com"]
}

然后执行以下命令重启

bash
sudo systemctl daemon-reload
sudo systemctl restart docker

常用命令

bash
docker pull [image-name] # 拉取指定的docker镜像
docker images # 列出已经拉取的docker镜像
docker image ls # 列出已经拉取的docker镜像
docker ps # 列出正在运行的容器
docker contianer ls # 列出正在运行的容器
docker ps -a # 列出所有容器
docker container stop [container-name] # 停止正在运行的容器
docker container kill [container-name] # 杀死正在运行的容器(不安全)
docker container rm [container-name] # 移除已经停止的容器
docker exec -it [container-name] bash # 进入容器并执行bash命令(常用于操作容器内部)
docker run -p 80:80 --name [some-name] -d -v /xxx:/docker [container-name] # 启动指定容器,映射端口和数据卷,指定名称,后台运行
docker build -t [image-name] . # 使用Dockerfile构建并指定镜像名称

定制开发环境镜像

两种定制方法:

1.使用commit保存镜像

2.使用dockerfile脚本构建镜像

Note

一般建议生产环境下使用dockerfile构建镜像

镜像备份与迁移

bash
docker commit # 将在运行的容器生成镜像
docker save # 将镜像生成tar文件

docker-compose的使用

编排2个以上的容器建议使用docker-compose

基本操作

bash
docker-compose up -d # 以后台方式启动容器
docker-compose down # 关闭启动的容器

例如nginx镜像的docker-compse.yml文件模板如下

yaml
version: "3"
services:
	nginx:
		image: nginx
		volumes:
			- /some/content:/usr/share/nginx/html:ro
		ports:
			- "8080:80"
    restart: always
    command: # docker run ... command

部署常见Web服务

nginx

bash
docker run --name some-nginx -p 8080:80 -v /some/content:/usr/share/nginx/html:ro -d nginx

apache2

node

gitlab-runner

gitlab CE

bash
docker run --detach \
	--hostname gitlab.example.com \
	--publish 443:443 --publish 80:80 --publish 22:22 \
	--name gitlab \
	--restart always \
	--volume /srv/gitlab/config:/etc/gitlab \
	--volume /srv/gitlab/logs:/var/log/gitlab \
	--volume /srv/gitlab/data:/var/opt/gitlab \
	gitlab/gitlab-ce:latest

容器互联

bash
# 创建自定义docker网络my-net
docker create network -d bridge my-net

# 开启两个容器连入自定义docker网络
docker run -it --name alpine1 --network my-net alpine:3.8
docker run -it --name alpine2 --network my-net alpine:3.8

docker-compose写法如下

yaml
version: "3"
services:
  a1:
    image: alpine:3.8
    networks:
      - my-net
  a2:
    image: alpine:3.8
    networks:
      - my-net
networks:
  my-net:

多阶段构建

以vue项目在node容器构建,并部署到nginx服务为例

Dockerfile如下

bash
FROM node:11-alpine as build-stage

WORKDIR /app

COPY . .

RUN ls & \
    yarn & \
    yarn build

FROM nginx:1.15-alpine as depoly-stage

COPY --from=0 /app/dist/app /usr/share/nginx/html

Note

将上一个容器构建的输出作为下一个容器的输入是多阶段构建的关键之处

其他

获取Docker容器所有IP地址

bash
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)