您现在的位置是:首页 > 后台技术 > LinuxLinux

linux环境中使用docker(图文)

第十三双眼睛2021-12-17【Linux】人已围观

简介docker是一种容器技术,一种软件容器平台

Docker与虚拟机的区别
虚拟机时携带操作系统的,本身很小的应用却携带了很大的操作系统,变得很大,但是Docker是不携带操作系统的,因此Docker的应用就会很轻巧,另外在调用宿主机内存方面,虚拟机是利用Hypervisor去虚拟化内存,整个调用过程是虚拟内存->虚拟物理内存->真正物理内存,但是Docker是利用Docker Engine去调用宿主的的资源,这时候过程是虚拟内存->真正物理内存。下面是两者的对比:

Docker的安装
首先,要卸载旧的docker,执行如下命令即可。
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

安装依赖:sudo yum install -y yum-utils 
配置yum源:sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装最新版的docker: sudo yum install docker-ce docker-ce-cli containerd.io

上面安装docker的方式必须有网络,如果没有网络的情况下,还想安装docker,必须用下面的方法:
离线方式安装docker
1下载docker二进制安装包,地址如下:
https://download.docker.com/linux/static/stable/x86_64/
将下载的软件包上传到服务器上
2用tar 命令解压安装包 tar -zxvf 软件包名称
3将docker相关命令拷贝到/usr/bin,方便直接运行命令
cp docker/* /usr/bin/
4启动docker守护程序
5执行命令docker info 验证docker是否安装成功
6为了使用方便,将docker注册成为服务
在/usr/lib/systemd/system/目录下创建docker.service文件
vi /usr/lib/systemd/system/docker.service
输入下面一段指令:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
  
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
  
[Install]
WantedBy=multi-user.target
7重新记载配置文件:
systemctl daemon-reload
8设置/取消开机自启动:
开机自启/取消开机自启 docker 服务
systemctl enable/disable docker

启动docker:
systemctl enable docker
systemctl start docker

可以看到,docker已经正常启动了
关闭docker:systemctl stop docker

可以看到,docker已经正常关闭了
测试docker安装是否正确:sudo docker run hello-world
执行找个命令时,会提示本地仓库没有镜像,并且会连接远程仓库进行自动下载。
查看镜像:docker images

bash安装(通用所有平台)
在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装,另外可以通过 --mirror 选项使用国内源进行安装:执行这个命令后,脚本就会自动的将一切准备工作做好,并且把 Docker 的稳定(stable)版本安装在系统中。
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
创建docker用户组:sudo groupadd docker
将当前用户加入docker组:sudo usermod -aG docker $USER
docker的核心架构:

镜像: 一个镜像代表一个应用环境,他是一个只读的文件,如 mysql镜像,tomcat镜像,nginx镜像等
容器: 镜像每次运行之后就是产生一个容器,就是正在运行的镜像,特点就是可读可写
仓库:用来存放镜像的位置,类似于maven仓库,也是镜像下载和上传的位置
dockerFile:docker生成镜像配置文件,用来书写自定义镜像的一些配置
tar:一个对镜像打包的文件,日后可以还原成镜像
docker运行流程:

镜像加速
docker配置阿里云镜像加速
访问阿里云登录自己账号查看docker镜像加速服务
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://lz2nib3q.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
验证docker的镜像加速是否生效:docker info
docker 的第一个程序:docker  run hello-world

常用命令:
docker version    --------------------------    查看docker的信息
docker info          --------------------------    查看更详细的信息
docker --help      --------------------------    帮助命令
Images 镜像命令:
1.查看本机中所有镜像
    docker images    --------------------------    列出本地所有镜像
        -a            列出所有镜像(包含中间映像层)
      -q            只显示镜像id
      docker images tomcat(镜像名称) ---------- 列出指定镜像名称信息
2.搜索镜像
    docker search [options] 镜像名    -------------------    去dockerhub上查询当前镜像
      --no-trunc      显示完整的镜像信息
3.从仓库下载镜像
    docker pull 镜像名[:TAG|@DIGEST]    ----------------- 下载镜像
    docker pull 镜像名   ------------------- 代表下载最新版本镜像
    docker pull 镜像名:version ------------- 代表下载指定版本的镜像
4.删除镜像
    docker rmi 镜像名    --------------------------  删除镜像
    -f        强制删除
Contrainer 容器命令
1.运行容器
    docker run 镜像名:tag    --------------------------    镜像名新建并启动容器
    --name                         别名为容器起一个名字
    -d                                启动守护式容器(在后台启动容器)
    -p                                 宿主机端口号:容器端口号        
    --rm                临时容器(退出之后立即删除)
    --restart  always 总是重启(在每次启动docker时自动重启该容器)
2.查看运行的容器
    docker ps                    --------------------------    列出所有正在运行的容器
    -a            正在运行的和历史运行过的容器
    -q            静默模式,只显示容器编号
3.停止|关闭|重启|暂停|恢复|容器
    docker start   容器名字或者容器id  --------------- 开启容器
    docker restart 容器名或者容器id    --------------- 重启容器
    docker stop  容器名或者容器id         ------------------ 正常停止容器运行
    docker kill  容器名或者容器id      ------------------ 立即停止容器运行
    docker pause|unpause 容器名或容器id ----------------- 暂停和恢复容器
4.删除容器
    docker rm -f 容器id和容器名     
    docker rm -f $(docker ps -aq)        --------------------------    删除所有容器
5.查看容器内进程
    docker top 容器id或者容器名 ------------------ 查看容器内的进程
6.查看查看容器内部细节
    docker inspect 容器id         ------------------ 查看容器内部细节
7.查看容器的运行日志
    docker logs [OPTIONS] 容器id或容器名    ------------------ 查看容器日志
    -t             加入时间戳
    -f             跟随最新的日志打印
    --tail      数字    显示最后多少条
8.进入容器内部
    docker exec [options] 容器id 容器内命令 ------------------ 进入容器执行命令
    -i        以交互模式运行容器,通常与-t一起使用
  -t        分配一个伪终端    shell窗口   bash 
9.容器和宿主机之间复制文件
    docker cp 文件|目录 容器id:容器路径           -----------------   将宿主机复制到容器内部
    docker cp 容器id:容器内资源路径 宿主机目录路径  -----------------   将容器内资源拷贝到主机上
10.数据卷(volume)实现与宿主机共享目录
    docker run -v 宿主机的路径|任意别名:/容器内的路径 镜像名
        注意: 
                1.如果是宿主机路径必须是绝对路径,宿主机目录会覆盖容器内目录内容
                2.如果是别名则会在docker运行容器时自动在宿主机中创建一个目录,并将容器目录文件复制到宿主机中
11.打包镜像
    docker save 镜像名 -o   名称.tar
12.载入镜像
    docker load -i   名称.tar
13.容器打包成新的镜像
    docker commit -m "描述信息" -a "作者信息"   (容器id或者名称)   打包的镜像名称:标签
14.推送镜像到远程docker hub
-  1.登录docker hub 注册自己账号 (xiaochen2019 密码)
-  2.登录网页版docker hub
-  3.在docker命令行界面登录docker hub 
        `docker login` 按照提示输入用户名  输入密码
-  4.给本地仓库提交镜像打一个tag标签
        docker tag 原始镜像id|原始镜像名称:tag 注册账号/镜像名称:版本
-  5.推送镜像
    docker  push  注册账号/镜像名称:版本
Docker安装常用服务
安装mysql
1.拉取mysql镜像到本地
    docker pull mysql:tag (tag不加默认最新版本)    
2.运行mysql服务
    docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:tag                            --没有暴露外部端口外部不能连接
    docker run --name mysql -e MYSQL_ROOT_PASSWORD=root  -p 3306:3306 -d  mysql:tag  --没有暴露外部端口
    docker run --name mysql03 -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d -v /root/mysqldata:/var/lib/mysql mysql:tag ---实现数据共享
3.进入mysql容器
    docker exec -it 容器名称|容器id bash
4.外部查看mysql日志
    docker logs 容器名称|容器id
5.使用自定义配置参数
    docker run --name mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -d mysql:tag
6.将容器数据位置与宿主机位置挂载保证数据安全
    docker run --name mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:tag
7.通过其他客户端访问 如在window系统|macos系统使用客户端工具访问
安装Tomcat
1.在docker hub搜索tomcat
    docker search tomcat
2.下载tomcat镜像
    docker pull tomcat
3.运行tomcat镜像
    docker run -p 8080:8080 -d --name mytomcat tomcat
4.进入tomcat容器
    docker exec -it mytomcat /bin/bash
5.将webapps目录挂载在外部
    docker run -p 8080:8080 -v /root/webapps:/usr/local/tomcat/webapps -d --name mytomcat tomcat

Dockerfile
什么是Dockerfile
文件  Dockerfile    Docker镜像的描述文件   作用: 用来构建docker镜像的文件
Dockerfile可以认为是Docker镜像的描述文件,是由一系列命令和参数构成的脚本。主要作用是用来构建docker镜像的构建文件。

Dockerfile解析过程

Dockerfile的保留命令:
FROM:当前镜像是基于哪个镜像构建 第一个指令必须是FROM
MAINT:AINER镜像维护者的姓名和邮箱地址  废弃
RUN构:建镜像时需要运行的指令
EXPOSE:当前容器对外暴露出的端口号
WORKDIR:指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar包
COPY:类似于ADD,拷贝文件和目录到镜像中
将从构建上下文目录中<原路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
ENV:用来在构建镜像过程中设置环境变量
VOLUME:容器数据卷,用于数据保存和持久化工作  docker -v /root/data:/usr/local/tomcat/webapps
CMD:指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换
ENTRYPOINT:指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及其参数

FROM 命令:基于那个镜像进行构建新的镜像,在构建时会自动从docker hub拉取base镜像 必须作为Dockerfile的第一个指令出现
FROM  <image>
FROM  <image>[:<tag>]     使用版本不写为latest
FROM  <image>[@<digest>]  使用摘要

MAINTAINER  命令:镜像维护者的姓名和邮箱地址[废弃]
MAINTAINER <name>

RUN 命令:RUN指令将在当前映像之上的新层中执行任何命令并提交结果。生成的提交映像将用于Dockerfile中的下一步
RUN <command> (shell form, the command is run in a shell, which by default is /bin/sh -c on Linux or cmd /S /C on Windows)
RUN echo hello

RUN ["executable", "param1", "param2"] (exec form)
RUN ["/bin/bash", "-c", "echo hello"]

EXPOSE 命令:用来指定构建的镜像在运行为容器时对外暴露的端口 仅仅是一个说明
Tomcat Dockerfile: EXPOSE 3306  ==> docker run -p 宿主机端口:8080
MYSQL  Dockerfile: EXPOSE 3306
RabbitMQ: Dockerfile: EXPOSE 5672 15672
EXPOSE 80/tcp  如果没有显示指定则默认暴露都是tcp
EXPOSE 80/udp

CMD 命令:用来为启动的容器指定执行的命令,在Dockerfile中只能有一条CMD指令。如果列出多个命令,则只有最后一个命令才会生效。
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

WORKDIR 命令:用来为Dockerfile中的任何RUN、CMD、ENTRYPOINT、COPY和ADD指令设置工作目录。如果WORKDIR不存在,即使它没有在任何后续Dockerfile指令中使用,它也将被创建。
WORKDIR /path/to/workdir

WORKDIR /a
WORKDIR b  /a/b 
WORKDIR c  /a/b/c
`注意:WORKDIR指令可以在Dockerfile中多次使用。如果提供了相对路径,则该路径将与先前WORKDIR指令的路径相对`

ENV 命令:用来为构建镜像设置环境变量。这个值将出现在构建阶段中所有后续指令的环境中。
ENV <key> <value>
ENV <key>=<value> ...

ADD 命令:用来从context上下文复制新文件、目录或远程文件url,并将它们添加到位于指定路径的映像文件系统中。
ADD hom* /mydir/       通配符添加多个文件
ADD hom?.txt /mydir/   通配符添加
ADD test.txt relativeDir/  可以指定相对路径
ADD test.txt /absoluteDir/ 也可以指定绝对路径
ADD url 

COPY 命令:用来将context目录中指定文件复制到镜像的指定目录中
COPY src dest
COPY ["<src>",... "<dest>"]

VOLUME 命令:用来定义容器运行时可以挂在到宿主机的目录  这个volume也是一个说明
VOLUME ["/data"]

ENTRYPOINT命令:用来指定容器启动时执行命令和CMD类似
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
ENTRYPOINT指令,往往用于设置容器启动后的第一个命令,这对一个容器来说往往是固定的。
CMD指令,往往用于设置容器启动的第一个命令的默认参数,这对一个容器来说可以是变化的。
Dockerfile说明:

Dockerfile构建项目
先准备一个springboot的项目,并将其上传到linux系统中。
编写Dockerfile
FROM openjdk:8u312-oraclelinux7
WORKDIR /apps
ADD docker-demo.jar /apps
EXPOSE 9010
ENTRYPOINT ["java","-jar"]
CMD ["docker-demo.jar"]
构建镜像
 docker build -t demo .

可以看到,镜像已经成功构建
运行镜像:docker run -p 9010:9010 -d demo

可以看到容器已经成功运行了
在浏览器输入 http://192.168.184.141:9010/rest/manage/user/getById?id=1 进行访问

可以看到已经正确返回了结果

高级网络配置
当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge(桥),可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。如下图:

查看网络信息:docker network ls
创建一个网桥:docker network create -d bridge 网桥名称
删除一个网桥:docker network rm 网桥名称

高级数据卷配置
作用: 数据卷(volume) 用来实现宿主机和容器之前进行数据共享
使用:
数据卷必须在首次启动容器时使用-v参数指定
1.绝对路径方式数据    注意:使用这种方式会自动将容器中映射目录清空始终以绝对路径中内容为主
2.别名方式数据卷
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
数据卷 可以在容器之间共享和重用
对 数据卷 的修改会立马生效
对 数据卷 的更新,不会影响镜像
数据卷 默认会一直存在,即使容器被删除

查看docker中数据卷:docker volume ls
创建数据:docker volume create my-vol
查看数据卷:docker volume inspect my-vol   =====> 简化 docker inspect 容器id|容器名称、网桥名称、卷名 
[
    {
        "CreatedAt": "2020-11-25T11:43:56+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]
挂载数据卷:docker run -d -P --name web  -v my-vol:/usr/share/nginx/html  nginx
删除数据卷:docker volume rm my-vol

Docker Compose:称之为docker 容器编排工具
Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。
其代码目前在 https://github.com/docker/compose 上开源。
Compose 定位是 「定义和运行多个 Docker 容器的应用(Defining and running multi-container Docker applications)」,其前身是开源项目 Fig。
通过第一部分中的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
app容器  依赖 mysql  redis  es  mq ...   docker 手动管理
总结: docker-compose  docker官方容器编排工具
Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose 中有两个重要的概念:
项目 (project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。
服务 (service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
Compose 项目由 Python 编写,实现上调用了 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
安装与卸载
linux:在 Linux 上的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。例如,在 Linux 64 位系统上直接下载对应的二进制包。
sudo curl -L https://github.com/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
1.下载docker-compose
wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64
sudo chmod +x /usr/local/bin/docker-compose
macos、window:Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。Docker Desktop for Mac/Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。
bash命令补全bash命令补全:curl -L https://raw.githubusercontent.com/docker/compose/1.25.5/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
卸载:如果是二进制包方式安装的,删除二进制文件即可。
sudo rm /usr/local/bin/docker-compose
测试安装成功:docker-compose --version
docker compose使用
服务 (service):一个服务就是一个应用容器,实际上可以运行多个相同镜像的实例。
项目 (project):由一组关联的应用容器组成的一个完整业务单元。?一个项目可以由多个服务(容器)关联而成,Compose 面向项目进行管理。
最常见的项目是 web 网站,该项目应该包含 web 应用和缓存。
springboot应用
mysql服务
redis服务
elasticsearch服务
3.docker-compose模板
- 参考文档:https://docker_practice.gitee.io/zh-cn/compose/compose_file.html
version: "3.0"
services:
  mysqldb:
    image: mysql:5.7.19
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - /root/mysql/conf:/etc/mysql/conf.d
      - /root/mysql/logs:/logs
      - /root/mysql/data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
    networks:
      - ems
    depends_on:
      - redis

  redis:
    image: redis:4.0.14
    container_name: redis
    ports:
      - "6379:6379"
    networks:
      - ems
    volumes:
      - /root/redis/data:/data
    command: redis-server
    
networks:
  ems:
4.通过docker-compose运行一组容器
- 参考文档:https://docker_practice.gitee.io/zh-cn/compose/commands.html
[root@centos ~]# docker-compose up                                //前台启动一组服务
[root@centos ~]# docker-compose up -d                             //后台启动一组服务

docker-compose 模板文件
模板文件是使用 Compose 的核心,涉及到的指令关键字也比较多。但大家不用担心,这里面大部分指令跟 docker run 相关参数的含义都是类似的。
默认的模板文件名称为 docker-compose.yml,格式为 YAML 格式。

下面分别介绍各个指令的用法。
build:指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
version: '3'
services:

  webapp:
    build: ./dir
也可以使用 context 指令指定 Dockerfile 所在文件夹的路径。
使用 dockerfile 指令指定 Dockerfile 文件名。
使用 arg 指令指定构建镜像时的变量。
command:覆盖容器启动后默认执行的命令。
container_name:指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式。
depends_on:解决容器的依赖、启动先后的问题。以下例子中会先启动 redis db 再启动 web
version: '3'

services:
  web:
    build: .
    depends_on:
      - db
      - redis

  redis:
    image: redis

  db:
    image: postgres
env_file:从文件中获取环境变量,可以为单独的文件路径或列表。
如果通过 docker-compose -f FILE 方式来指定 Compose 模板文件,则 env_file 中变量的路径会基于模板文件路径。
如果有变量名称与 environment 指令冲突,则按照惯例,以后者为准。
环境变量文件中每一行必须符合格式,支持 # 开头的注释行。
environment:设置环境变量。你可以使用数组或字典两种格式。
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据
environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET
healthcheck:通过命令检查容器是否健康运行。
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 1m30s
  timeout: 10s
  retries: 3

image:指定为镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
networks:配置容器连接的网络
ports:暴露端口信息。
使用宿主端口:容器端口 (HOST:CONTAINER) 格式,或者仅仅指定容器的端口(宿主将会随机选择端口)都可以。
sysctls:配置容器内核参数
ulimits:指定容器的 ulimits 限制值。
volumes:数据卷所挂载路径设置。可以设置为宿主机路径(HOST:CONTAINER)或者数据卷名称(VOLUME:CONTAINER),并且可以设置访问模式 (HOST:CONTAINER:ro)。
该指令中路径支持相对路径。
docker-compose 常用命令
命令对象与格式
对于 Compose 来说,大部分命令的对象既可以是项目本身,也可以指定为项目中的服务或者容器。如果没有特别的说明,命令对象将是项目,这意味着项目中所有的服务都会受到命令影响。
执行 docker-compose [COMMAND] --help 或者 docker-compose help [COMMAND] 可以查看具体某个命令的使用格式。
docker-compose 命令的基本的使用格式是:docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令选项:
-f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。
-p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
--x-networking 使用 Docker 的可拔插网络后端特性
--x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge
--verbose 输出更多调试信息。
-v, --version 打印版本并退出。
命令使用说明:
up  [重点]
格式为 docker-compose up [options] [SERVICE...]。
该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。
链接的服务都将会被自动启动,除非已经处于运行状态。
可以说,大部分时候都可以直接通过该命令来启动一个项目。
默认情况,docker-compose up 启动的容器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。
当通过 Ctrl-C 停止命令时,所有容器将会停止。
如果使用 docker-compose up -d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选项。
默认情况,如果服务容器已经存在,docker-compose up 将会尝试停止容器,然后重新创建(保持使用 volumes-from 挂载的卷),以保证新启动的服务匹配 docker-compose.yml 文件的最新内容
down  [重点]
注意: docker-compose down 关闭所有容器
此命令将会停止 up 命令所启动的容器,并移除网络
exec
格式为: docker-compose exec 服务id bash(命令)
进入指定的容器。
ps
格式为 docker-compose ps [options] [SERVICE...]。
列出项目中目前的所有容器。
选项:
-q 只打印容器的 ID 信息。
restart
格式为 docker-compose restart [options] [SERVICE...]。
重启项目中的服务。
选项:
-t, --timeout TIMEOUT 指定重启前停止容器的超时(默认为 10 秒)。
rm
格式为 docker-compose rm [options] [SERVICE...]。
删除所有(停止状态的)服务容器。推荐先执行 docker-compose stop 命令来停止容器。
选项:
-f, --force 强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
-v 删除容器所挂载的数据卷。
start
格式为 docker-compose start [SERVICE...]。
启动已经存在的服务容器。
stop
停止某个服务
格式为 docker-compose stop [options] [SERVICE...]。
停止已经处于运行状态的容器,但不删除它。通过 docker-compose start 可以再次启动这些容器。
选项:
-t, --timeout TIMEOUT 停止容器时候的超时(默认为 10 秒)。
top
查看各个服务容器内运行的进程。
unpause
格式为 docker-compose unpause [SERVICE...]。
恢复处于暂停状态中的服务。
logs [重点]
格式为 docker-compose logs -f [SERVICE]

Docker 可视化工具
安装Portainer
官方安装说明:https://www.portainer.io/installation/
登录和使用Portainer
用浏览器访问:http://localhost:9000
Swarm模式
Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具。
运行 Docker 的主机可以主动初始化一个 Swarm 集群或者加入一个已存在的 Swarm 集群,这样这个运行 Docker 的主机就成为一个 Swarm 集群的节点 (node) 。
节点分为管理 (manager) 节点和工作 (worker) 节点。
管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。
工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。
来自 Docker 官网的这张图片形象的展示了集群中管理节点与工作节点的关系

创建Swarm集群
1.初始化集群
docker swarm init --advertise-addr 192.168.99.100
注意: 如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr 指定 IP
增加工作节点:
1.增加节点
docker swarm join 
    --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
    192.168.99.100:2377
查看集群节点
docker node ls
通过docker-compose.yml部署服务
version: "3.8"

services:
  nginx:
    image: nginx:latest
    ports:
      - '80:80'
    deploy:
      mode: replicated
      replicas: 1


  tomcat:
    image: tomcat:8.0
    ports:
      - "8080:8080"
    deploy:
      placement:
        constraints: [ node.role == manager ]
部署服务:docker stack deploy -c docker-compose.yml 栈名
查看服务:docker stack ls
移除服务:docker stack down 栈名

 

Tags:linux   docker

很赞哦! ()

文章评论

    共有条评论来说两句吧...

    用户名:

    验证码:

站点信息

  • 网站名称:JavaStudy
  • 建站时间:2019-1-14
  • 网站程序:帝国CMS7.5
  • 文章统计242篇文章
  • 标签管理标签云
  • 统计数据百度统计
  • 微信公众号:扫描二维码,关注我们