Docker

简介

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

优点

Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。

容器

# 拉取镜像
docker pull xx
# 开启容器
docker run -it xxx /bin/bash
- -i # 交互模式
- -t # 终端
- -d # 后台
- --name # 容器的别名
- -P # 容器内部应用使用的端口随机映射主机上面
- -p # 设置端口映射 -p 2000:3000 2000为主机端口 3000为容器内端口
- --rm # 退出容器的时候自动清理文件系统
- -h # 设定容器的主机名
- --dns=ip # 添加dns地址到/etc/resolv.conf
# 如果想要绑定udp端口
docker run -it -p xxx:xxx/udp xxx
# 进入容器
docker exec -it xx /bin/bash
docker ps -a
docker start xxx
# 停止容器
docker stop xx
# 重启容器
docker restart xx
# 导入导出容器
## 导出容器快照
docker export ID > name.tar
## 导入容器镜像
docker import http://xxx example/imagerepo
cat name.tar | docker import - test/image:v1
# 删除容器
docker rm -f ID
# 查看容器内部标准输出
docker logs -f ID
- -f # tail -f
# 查看容器内部进程
dcoker top ID

镜像

docker images
docker pull xx
docker search httpd # https://hub.docker.com/
# 删除镜像
docker rmi ID
# 自主更新镜像(修改容器)
## 修改完一个容器之后exit退出容器返回一个容器ID
docker commit -m "xx" -a "xx" ID imageName
- -m # 描述信息
- -a # 镜像作者
# Dockerfile创建
docker build -t imageName:Tag DockerfileDir
- -t # 指定容器名

仓库管理

# 登陆
docker login
# 退出
docker logout
# 推送镜像
## 操作容器
docker commit -a "RoboTerh" -m "fastjson漏洞环境" 430 roboterh/fastjson:1.2.68
## 登陆账号
docker login
## 提交镜像
docker push roboterh/fastjson:1.2.68
## 退出登陆
docker logout
docker tag xx username/imageName
docker push username/imageName

Dockerfile

FROM imageName
# 用于docker build中使用
RUN 
- RUN id == id
- RUN ["test.php", "arg1", "arg2"] == test.php arg1 ,arg2
# 从上下文目录复制文件到容器里指定路径
COPY [--chown=<user>:<group>] sDir dDir # 支持通配符, 会自动创建路径
- --chown # 设置复制进容器的文件属性
# 用于docker run中使用
CMD 
# 运行程序 且只有最后一个CMD指令有效 (需要使用逗号分割)

# CMD类似,不会被docker run后面的覆盖, 且run后面的命令行参数会传送给ENTRYPOINT
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
# 搭配CMD使用,给ENTRYPOINT传参
ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参
# 设置环境变量
ENV key value
ENV key1=value1 key2=value2
# 构造参数,作用域为Dockerfile
ARG key value # 构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖
# 挂载卷
VOLUME dir # 在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点
# 声明端口
EXPOSE port
# 设置工作目录
WORKDIR dir
# 切换执行命令的用户, 需要存在这个用户
USER user

多阶构建

要求: Docker的版本在17.05及以上

# 在Dockerfile里可以使用as来为某一阶段取一个别名”build-env”
FROM golang:1.11.2-alpine3.8 AS build-env
# 然后从上一阶段的镜像中复制文件,也可以复制任意镜像中的文件
COPY –from=build-env /go/bin/hello /usr/bin/hello

例子:

FROM golang:1.11.4-alpine3.8 AS build-env
 
ENV GO111MODULE=off
ENV GO15VENDOREXPERIMENT=1
ENV GITPATH=github.com/lattecake/hello
RUN mkdir -p /go/src/${GITPATH}
COPY ./ /go/src/${GITPATH}
RUN cd /go/src/${GITPATH} && CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go install -v
 
FROM alpine:latest
ENV apk –no-cache add ca-certificates
COPY --from=build-env /go/bin/hello /root/hello
WORKDIR /root
CMD ["/root/hello"]

Docker Compose

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。
# 启动
docker-compose up
# 后台运行
docker-compose up -d
# 关闭
docker-compose down

# 版本
version: "number"
# 构建镜像的上下文路径
build: dir
# 覆盖容器启动时的默认命令
command: ["xx", "xx"]
# 设置依赖关系
depends_on:
	- db
	- redis
# 指定设备映射列表
devices:
	- "/dev/ttyUSB0:/dev/ttyUSB0"
# 映射端口
ports:
	- "port1:port2"
# 自定义dns服务器
dns: ip
# 这是环境变量
environment:
	SHOW: 'true'
# 指定容器运行的镜像
image: redis/id
# 设置重启策略
restart: "no" # 是默认的重启策略,在任何情况下都不会重启容器
restart: always # 容器总是重新启动
restart: on-failure # 在容器非正常退出时(退出状态非0),才会重启容器
restart: unless-stopped # 在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
# 伪终端
tty: "true"

Docker使用收集

docker配置文件添加端口

  1. docker ps -a查看容器ID

  2. systemctl stop docker停止docker

  3. vim /var/lib/docker/containers/ID/hostconfig.json

    如果之前没有端口映射, 应该有这样的一段: “PortBindings”:{} 增加一个映射, 这样写: “PortBindings”:{“8080/tcp”:[{“HostIp”:””,“HostPort”:“60000”}]} 前一个数字是容器端口, 后一个是宿主机端口。将宿主机的60000端口映射到容器的8080端口 而修改现有端口映射更简单, 把端口号改掉就行。

  4. 如果也有config.v2.json,也需要更改

    “ExposedPorts”:{ “80/tcp”:{ },”3306/tcp”:{ },”XXXX/tcp”:{ }} #注:这里写的都是容器内的端口

  5. systemctl restart docker

  6. docker inspect ID可以发现修改成功

docker pull加速

  1. vim /etc/docker/daemon.json

    {
    “registry-mirrors”: [“https://fy707np5.mirror.aliyuncs.com"]
    }

  2. systemctl daemon-reload

  3. systemctl restart docker