一、常用容器使用
1. Mysql容器
拉取镜像
# 拉取MySQL 5.7镜像
docker pull centos/mysql-57-centos7
创建容器
# 创建mysql5.7容器
docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root centos/mysql-
57-centos7
-p代表端口映射,格式为宿主机映射端口:容器运行端口-e代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的远程登陆密码(如果是在容器中使用root登录的话,那么其密码为空)
-d代表开启守护式容器
-i代表启动容器
操作容器MySQL
# 拉取MySQL 5.7镜像
docker exec -it mysql5.7 /bin/bash
# 登录容器里面的mysql
mysql -u root -p
2. Tomcat容器
拉取镜像
# 拉取tomcat镜像
docker pull tomcat
创建容器
# 创建tomcat容器;并挂载了webapps目录
docker run -di --name=mytomcat -p 8080:8080 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat
# 如果出现 WARNING: IPv4 forwarding is disabled. Networking will not work.
#执行如下操作
# 1、编辑 sysctl.conf
vi /etc/sysctl.conf
# 2、在上述打开的文件中后面添加
net.ipv4.ip_forward=1
# 3、重启network
systemctl restart network
3. Nginx容器
拉取镜像
# 拉取nginx镜像
docker pull nginx
创建容器
# 创建nginx容器
docker run -di --name=mynginx -p 80:80 nginx
4. Redis容器
拉取镜像
# 拉取redis镜像
docker pull redis
创建容器
# 创建redis容器
docker run -di --name=myredis -p 6379:6379 redis
操作容器
#进入redis容器
docker exec -it myredis /bin/bash
#进入redis安装目录
cd /usr/local/bin
#连接redis
./redis-cli
远程连接容器
5.rabbitmq容器
-
下载rabbitmq镜像
docker pull rabbitmq:management -
运行
sudo docker run -di -p 15672:15672 -p 4369:4369 -p 5672:5672 --name myrabitmq rabbitmq:management'docker run -di -p 15672:15672 -p 5672:5672 --name myrabitmq 容器id'
5672:应用访问端口;15672:控制台Web端口号
五、Docker Compose(理解运用)
1. 简介与组成
简介
Compose项目是Docker官方的开源项目 , 负责实现对Docker容器集群的快速编排 .
它是一个定义和运行多容器的docker应用工具 , 使用compose,我们可以通过YMAL文件配置自己的服务,然后通过一个命令,就可以使用配置文件创建和运行所有的服务.
组成
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。
Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工 程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参 数,依赖。
一个服务当中可包括多个容器实例。
- 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。每个服务都有自己的名 字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等,即以容器为粒度,用户需要Compose所完成的任务。
- 项目(project):由一组关联的应用容器组成的一个完成业务单元,在docker-compose.yml中定义。即是 Compose的一个配置文件可以解析为一个项目,Compose通过分析指定配置文件,得出配置文件所需完成的所有容器管理与部署操作。
Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。
例如:要部署一个Web项目,除了Web服务容器,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
2. 安装与卸载
curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限
chmod +x /usr/local/bin/docker-compose
# 查看版本信息
docker-compose -version
#卸载docker-compose
rm -f /usr/local/bin/docker-compose
3. 常用命令
| SUBCOMMAND | 解释 |
|---|---|
| build | 构建或重建服务 |
| help | 命令帮助 |
| kill | 杀掉容器 |
| logs | 显示容器的输出内容 |
| port | 打印绑定的开放端口 |
| ps | 显示容器 |
| pull | 拉取服务镜像 |
| restart | 重启服务 |
| rm | 删除停止的容器 |
| run | 运行一个一次性命令 |
| scale | 设置服务的容器数目 |
| start | 开启服务 |
| stop | 停止服务 |
| up | 创建并启动容器服务(-d:后台启动) |
4. 模版文件
模板文件是使用Compose的核心,涉及的指令关键字也比较多,大部分指令与docker run 相关参数的含义都是类 似的。
默认的模板文件名称为docker-compose.yml , 格式为YAML格式 . 比如一个Compose模板文件:
version: "2"
services:
web:
images: nginx
ports:
- "8080:80"
volumes:
- /usr/local/abc:/usr/local/cba
#volumes:
#networks:
Docker Compose的模板文件主要分为3个区域,如下:
- services 服务,在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网络、依赖哪些其他服务等等。
- volumes 数据卷,在它下面可以定义的数据卷(名字等等),然后挂载到不同的服务下去使用。
- networks 应用的网络,在它下面可以定义应用的名字、使用的网络类型等等。
5. 应用Compose
创建模板文件
# 创建文件夹
mkdir -p /usr/local/mycompose
#进入文件夹
cd /usr/local/mycompose
#创建 docker-compose.yml文件;内容如下
vi docker-compose.yml
编写模板文件
version: '3'
services:
redis1:
image: redis
ports:
- "6379:6379"
container_name: "redis1"
networks:
- dev
mysql1:
image: centos/mysql-57-centos7
environment:
MYSQL_ROOT_PASSWORD: "root"
ports:
- "3306:3306"
container_name: "mysql1"
networks:
- dev
web1:
image: tomcat
ports:
- "9090:8080"
container_name: "web1"
networks:
- dev
- pro
networks:
dev:
driver: bridge
pro:
driver: bridge
启动服务
cd /usr/local/mycompose
# up 命令行
docker-compose up
# 如果后台启动则使用如下命令 -d 后台启动
docker-compose up -d
# 若要停止
docker-compose stop
二、构造自己的镜象
构造自己的镜象有两种方式:
docker commit命令
docker build命令和Dockerfile文件
注意:我们说构造自己的镜象,不是完全要自己做一个镜象,而是在现有的基础上进行打包封装成一个镜象。
1. docker commit命令
以安装一个redis为例。先找到一个简单的镜象
centos 7 5182e96772bf 5 months ago 200MB
这里面找到了一个centos7的镜象,这个就是一个操作系统,其它的什么都没有。
创建一个容器redis01
[root@localhost ~]# docker run -it --name=redis01 -p 6379:6379 centos:7 /bin/bash
进入容器安装环境(如果已经存在就可以不用再次安装环境了):
yum install gcc-c++
yum install ruby
yum -y install gcc automake autoconf libtool make
上传源文件,进行安装redis.并启动redis
测试:
Jedis jedis = new Jedis("192.168.25.134",7000);
System.out.println(jedis.ping());
jedis.close();
把容器保存为镜象
[root@localhost ~]# docker commit redis01 myredis
用新的镜象创建一个容器
[root@localhost ~]# docker run -di --name=redis02 -p 6379:6379 myredis
2. Dockerfile文件
Docker 可以通过 Dockerfile 的内容来自动构建镜像。Dockerfile 是一个包含创建镜像所有命令的文本文件,通过 docker build 命令可以根据 Dockerfile 的内容构建镜像,在介绍如何构建之前先介绍下 Dockerfile 的基本语法结构。
例如:创建一个Dockerfile文件,内容如下。
FROM centos:7
MAINTAINER zl
RUN yum install gcc-c++ -y -y -y -y
RUN yum install ruby -y -y -y -y
RUN mkdir /opt/redis/
ADD redis /opt/redis
EXPOSE 6379
FROM centos:7 说明这个镜象是建立在centos:7这个镜象的基础上的。
MAINTAINER zl 说明这:个dockerfile文件是一个叫zl的人创建的。
RUN yum install gcc-c++ -y -y -y -y 说明要运行一个yum指令,安装了gcc-c++ 的软件,后面加了多个-y,因为在安装gcc-c++软件的时候,要多次输入参数y表示同意,所以这里面就加了多个参数y .
RUN yum install ruby -y -y -y -y 同上,这次安装的环境是ruby软件。
RUN mkdir /opt/redis/ 在docker容器里面创建一个目录/opt/redis/
ADD redis /opt/redis 把本机上的reids文件(夹),上传到docker容器里面的/opt/redis目录下。
EXPOSE 6379 容器对外暴露的接口是6379
3. Dockerfile 指令
FROM
用法:
FROM <image>
FROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来。FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。- 如果
FROM语句没有指定镜像标签,则默认使用latest标签。
MAINTAINER
用法:
MAINTAINER <name>
指定创建镜像的用户
RUN
每条 RUN 指令将在当前镜像基础上执行指定命令,有两种使用方式
- RUN (the command is run in a shell - /bin/sh -c - shell form)
- RUN [“executable”, “param1”, “param2”] (exec form)
RUN 指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的 RUN 都在之前 RUN 提交后的镜像为基础,镜像是分层的,可以通过一个镜像的任何一个历史提交点来创建,类似源码的版本控制。
exec 方式会被解析为一个 JSON 数组,所以必须使用双引号而不是单引号。exec 方式不会调用一个命令 shell,所以也就不会继承相应的变量,如:
RUN [ "echo", "$HOME" ]
这种方式是不会达到输出 HOME 变量的,正确的方式应该是这样的
RUN [ "sh", "-c", "echo", "$HOME" ]
EXPOSE
EXPOSE <port> [<port>...]
告诉 Docker 服务端容器对外映射的本地端口,需要在 docker run 的时候使用 -p 或者 -P 选项生效。
ENV
ENV <key> <value> # 只能设置一个变量
ENV <key>=<value> ... # 允许一次设置多个变量
指定一个环节变量,会被后续 RUN 指令使用,并在容器运行时保留。
例子:
ENV myName="John Doe" myDog=Rex\ The\ Dog \
myCat=fluffy
等同于
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy
使用变量用$myName方式使用。
ADD
ADD <src>... <dest>
ADD 复制本地主机文件、目录或者远程文件 URLS 从 并且添加到容器指定路径中 。
<src> 支持通过 GO 的正则模糊匹配,具体规则可参见 Go filepath.Match
ADD hom* /mydir/ # adds all files starting with "hom"
ADD hom?.txt /mydir/ # ? is replaced with any single character
<dest>路径必须是绝对路径,如果<dest>不存在,会自动创建对应目录<src>路径必须是 Dockerfile 所在路径的相对路径,也可以是一个网络地址。<src>如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制
COPY
COPY <src>... <dest>
COPY 复制新文件或者目录从 添加到容器指定路径中 。用法同 ADD,唯一的不同是不能指定远程文件 URLS。
WORKDIR
WORKDIR /path/to/workdir
为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
最终路径是 /a/b/c。
WORKDIR 指令可以在 ENV 设置变量之后调用环境变量:
ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
最终路径则为 /path/$DIRNAME。
VOLUME
VOLUME ["/data"]
创建一个可以从本地主机或其他容器挂载的挂载点,后续具体介绍。目录挂载。
USER
USER daemon
指定运行容器时的用户名或 UID,后续的 RUN、CMD、ENTRYPOINT 也会使用指定用户。最后不要加,加了之后以的运行容器都要加用户名了。
ONBUILD
ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。
例如,Dockerfile 使用如下的内容创建了镜像 image-A:
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果基于 image-A 创建新的镜像时,新的 Dockerfile 中使用 FROM image-A 指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令。
# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用 ONBUILD 指令的镜像,推荐在标签中注明,例如 ruby:1.9-onbuild。
docker build
$ docker build --help
Usage: docker build [OPTIONS] PATH | URL | -
Build a new image from the source code at PATH
--force-rm=false Always remove intermediate containers, even after unsuccessful builds # 移除过渡容器,即使构建失败
--no-cache=false Do not use cache when building the image # 不实用 cache
-q, --quiet=false Suppress the verbose output generated by the containers
--rm=true Remove intermediate containers after a successful build # 构建成功后移除过渡层容器
-t, --tag="" Repository name (and optionally a tag) to be applied to the resulting image in case of success
例如:
docker build -t=abc:001 .
docker build 可选择参数 Dockerfile所在目录
-t 说明是要指定镜象的名字和标签,abc是名字,001是标签。
. 说明就是这当前目录下找Dockerfile文件。
三、镜象的导入导出
1. 镜像备份
我们可以通过以下命令将镜像保存为tar 文件
docker save -o mynginx.tar mynginx_i
2. 镜像恢复与迁移
首先我们先删除掉mynginx_img镜像 然后执行此命令进行恢复
docker load -i mynginx.tar
-i 输入的文件
执行后再次查看镜像,可以看到镜像已经恢复