Docker
常用命令
命令 |
|
ip addr |
查看linux的ip地址 |
uname -r |
检查内核版本,必须是3.10及以上 |
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
设置yum源 |
sudo yum install docker-ce -y |
安装docker-ce |
systemctl start docker |
启动docker |
systemctl enable docker |
开机启动docker |
systemctl stop docker |
停止docker |
sudo yum remove docker-ce sudo rm -rf /var/lib/docker |
卸载 docker-ce |
yum -y remove docker docker-common docker-selinux docker-engine |
卸载旧版本 |
docker search 镜像关键字 |
搜索镜像 |
docker pull 镜像名:tag |
安装镜像 如:docker pull mysql:5.7.28:tag是可选的,tag表示标签,多为软件的版本,默认是latest |
docker images |
查看所有本地镜像 |
docker rmi 镜像id |
删除指定的本地镜像 |
docker run --name mytomcat -d tomcat:latest |
根据镜像启动容器 -name: 表示自定义容器名称-d: 表示后台运行 |
docker ps |
查看运行中的容器 |
docker ps -a |
查看所有的容器(启动的和没启动的) |
docker stop 容器的id / 容器名 |
停止运行中的容器 |
docker kill 容器ID或者容器名 |
强制停止容器 |
docker start 容器的id / 容器名 |
启动Exited的容器 |
docker rm 容器id |
删除一个容器 (容器必须处于停止状态) |
docker run -d -p 8888:8080 tomcat |
-d:后台运行-p: 将主机的端口映射到容器的一个端口 主机端口:容器内部的端口可以不指定 --name |
service firewalld status |
查看防火墙状态 |
service firewalld stop |
关闭防火墙 |
docker logs 容器id |
查看容器的日志 |
docker exec -it mysql bash |
进入容器命令行 |
docker inspect 容器id或容器名 |
查看容器详细信息 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| # 安装所需软件包 yum install -y gcc gcc-c++ yum-utils device-mapper-persistent-data lvm2
# 设置yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引 yum makecache fast
# 卸载 (之前安装过 没有安装过无需执行) # 旧版本 yum -y remove docker docker-common docker-selinux docker-engine # 新版本 sudo yum remove docker-ce sudo rm -rf /var/lib/docker
# 安装docker-ce sudo yum install docker-ce -y
# 启动docker systemctl start docker
# 设置开机启动docker systemctl enable docker
|
1 2 3 4 5 6 7 8 9 10
| # 编辑 vim /etc/docker/daemon.json
{"registry-mirrors": ["http://hub-mirror.c.163.com"] }
# 重新加载服务配置文件 systemctl daemon-reload
# 重启docker systemctl restart docker
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明(常用):有些是一个减号,有些是两个减号 --name="容器新名字": 为容器指定一个名称; -d: 后台运行容器,并返回容器ID,也即启动守护式容器; -i:以交互模式运行容器,通常与 -t 同时使用; -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用; -P: 随机端口映射; -p: 指定端口映射,有以下四种格式 ip:hostPort:containerPort ip::containerPort hostPort:containerPort containerPort
|
1 2 3 4 5 6 7 8 9 10 11
| docker ps [OPTIONS]
OPTIONS说明(常用): -a :列出当前所有正在运行的容器+历史上运行过的 -l :显示最近创建的容器。 -n:显示最近n个创建的容器。 -q :静默模式,只显示容器编号。 --no-trunc :不截断输出。
|
1 2 3 4
| 两种退出方式
exit 容器停止退出 ctrl+P+Q 容器不停止退出
|
-
重要命令
-
启动守护式容器
-
查看容器日志
1 2 3 4 5 6
| docker logs -f -t --tail 容器ID
* -t 是加入时间戳 * -f 跟随最新的日志打印 * --tail 数字 显示最后多少条
|
-
查看容器内运行的进程
-
查看容器内部细节
-
进入正在运行的容器并以命令行交互
1 2 3 4 5 6
| docker exec -it 容器ID bash exec 是在容器中打开新的终端,并且可以启动新的进程 可以直接执行命令拿到结果 (docker exec -t b6e03d3a3c18 top) docker attach 容器ID attach 直接进入容器启动命令的终端,不会启动新的进程 进去之后才能执行命令
|
-
从容器内拷贝文件到主机上
1
| docker cp 容器ID:容器内路径 目的主机路径
|
镜像commit操作
1 2 3
| docker commit 提交容器副本使之成为一个新的镜像 docker commit -a=“作者” -m=“提交的描述信息” 容器ID 要创建的目标镜像名:[标签名] docker commit -a="MuGe" -m="hello world" 673809066a2d lcopilot/tomcat01:1.2
|
数据卷
直接命令添加
1 2 3 4 5
| docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名
命令(带权限) docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名
|
Docker File添加
1 2
| VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
|
-
容器间传递共享
1 2 3 4 5 6
| --volumes-from
docker run -it --name dc02 --volumes-from dc01 zzyy/centos
容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止
|
Docker File
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
graph TD
A(docker从基础镜像运行一个容器)-->B(执行一条指令并对容器作出修改)
B-->c(执行类似docker commit的操作提交一个新的镜像层)
c-->D(docker再基于刚提交的镜像运行一个新容器)
D-->E(执行dockerfile中的下一条指令直到所有指令都执行完成)
Docker File体系结构(保留字指令)
指令 |
|
FROM |
基础镜像,当前新镜像是基于哪个镜像的 |
MAINTAINER |
镜像维护者的姓名和邮箱地址 |
RUN |
容器构建时需要运行的命令 |
EXPOSE |
当前容器对外暴露出的端口 |
WORKDIR |
指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点 |
ENV |
用来在构建镜像过程中设置环境变量 |
ADD |
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包 |
COPY |
类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置 |
VOLUME |
容器数据卷,用于数据保存和持久化工作 |
CMD |
指定一个容器启动时要运行的命令 Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换 |
ENTRYPOINT |
指定一个容器启动时要运行的命令 ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数 |
ONBUILD |
当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发 |
本地镜像发布到阿里云
阿里云镜像仓库
开通服务之后有完整的上传教程
graph LR
A(创建镜像仓库)-->B(选择代码源)
Docker Compose
Docker Compose 概述与安装?
- 简介
- Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
- Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。
- Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
- 使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
- Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
- Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。
- 前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知
- 使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具
安装 Docker Compose
快速入门
- 打包项目,获得 jar 包 docker-demo-0.0.1-SNAPSHOT.jar
- 在 jar 包所在路径创建 Dockerfile 文件,添加以下内容
1 2 3 4 5 6
| FROM java:8 VOLUME /tmp ADD docker-demo-0.0.1-SNAPSHOT.jar app.jar RUN bash -c 'touch /app.jar' EXPOSE 9000 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
|
- 在 jar 包所在路径创建文件 docker-compose.yml,添加以下内容
1 2 3 4 5 6
| version: '2' services: docker-demo: build: . ports: - "9000:8761"
|
- 在 docker-compose.yml 所在路径下执行该命令 Compose 就会自动构建镜像并使用镜像启动容器
1 2
| docker-compose up docker-compose up -d
|
工程、服务、容器
- Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)
- Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例
Docker Compose 常用命令与配置
常见命令
- port:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口
1
| docker-compose port eureka 8761
|
1
| docker-compose start eureka
|
1
| docker-compose stop eureka
|
1
| docker-compose rm eureka
|
- kill:通过发送 SIGKILL 信号来停止指定服务的容器
1
| docker-compose kill eureka
|
- pull:下载服务镜像
- scale:设置指定服务运气容器的个数,以 service=num 形式指定
1
| docker-compose scale user=3 movie=3
|
1
| docker-compose run web bash
|
docker-compose.yml 属性
- version:指定 docker-compose.yml 文件的写法格式
- services:多个容器集合
- build:配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 参数
1 2 3 4 5 6 7
| build: ./dir --------------- build: context: ./dir dockerfile: Dockerfile args: buildno: 1
|
1 2 3
| command: bundle exec thin -p 3000 ---------------------------------- command: [bundle,exec,thin,-p,3000]
|
1 2 3 4 5
| dns: 8.8.8.8 ------------ dns: - 8.8.8.8 - 9.9.9.9
|
- dns_search:配置 DNS 搜索域,可以是一个值或列表
1 2 3 4 5
| dns_search: example.com ------------------------ dns_search: - dc1.example.com - dc2.example.com
|
- environment:环境变量配置,可以用数组或字典两种方式
1 2 3 4 5 6 7
| environment: RACK_ENV: development SHOW: 'ture' ------------------------- environment: - RACK_ENV=development - SHOW=ture
|
- env_file:从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量
1 2 3 4
| env_file: .env --------------- env_file: - ./common.env
|
- expose:暴露端口,只将端口暴露给连接的服务,而不暴露给主机
1 2 3
| expose: - "3000" - "8000"
|
1 2 3 4 5
| network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
|
- ports:对外暴露的端口定义,和 expose 对应
1 2 3
| ports: # 暴露端口信息 - "宿主机端口:容器暴露端口" - "8763:8763" - "8763:8763"
|
- links:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
1 2
| links: - docker-compose-eureka-server:compose-eureka
|
1 2 3
| volumes: - /lib - /var
|
1 2 3 4
| --no-color 单色输出,不显示其他颜. -f, --follow 跟踪日志输出,就是可以实时查看日志 -t, --timestamps 显示时间戳 --tail 从日志的结尾显示,--tail=200
|
Docker Compose 其它
更新容器
- 当服务的配置发生更改时,可使用 docker-compose up 命令更新配置
- 此时,Compose 会删除旧容器并创建新容器,新容器会以不同的 IP 地址加入网络,名称保持不变,任何指向旧容起的连接都会被关闭,重新找到新容器并连接上去
links
- 服务之间可以使用服务名称相互访问,links 允许定义一个别名,从而使用该别名访问其它服务
1 2 3 4 5 6 7 8
| version: '2' services: web: build: . links: - "db:database" db: image: postgres
|
- 这样 Web 服务就可以使用 db 或 database 作为 hostname 访问 db 服务了