docker的使用分享

在这里插入图片描述

                    may the force be with you


在这里插入图片描述
在这里插入图片描述


1.什么是 docker

  • Docker是一个开源的应用容器引擎,基于Go语言并遵从Apach2.0协议开源。
  • Docker可以让开发者打包他们的应用以及依赖包包到一个轻量级,可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。

为什么使用Docker:

  • Docker是世界领先的软件容器平台
  • 自动执行重复性人物,构建接触的软件
  • 用户方便创建和使用容器
  • 运行环境的一致性。
  • 秒级,毫秒级的启动时间
  • 避免公用的服务器,资源受其他用户影响 – 隔离性
  • 弹性伸缩,快速扩建(服务忙闲不均,资源浪费)
  • 迁移方便
  • 持续交付和部署

2.云计算+大数据时代

  • IaaS(Infrastructure as a Service:基础设施即服务)
    提供服务器,需要开发一套代码,安装开发环境
  • PaaS(Platform-as-a-Service:平台即服务)
    提供服务器和安装环境,需要开发一套代码
  • SaaS(Software as a Service:软件即服务)
    提供服务器,开发环境,代码,只需要花钱

Docker compare VM
在这里插入图片描述

3.docker 架构

  • 镜像(Image
  • 容器(Container
  • 仓库(Repository

在这里插入图片描述

Docker面向对象
容器对象
镜像

在这里插入图片描述

4.docker install

docker install document: https://docs.docker.com/engine/install/centos/.

  • CentOS 系统的内核版本高于 3.10
    uname -r
  • 升级yum
    sudo yum update
  • 卸载旧版本
    sudo yum remove docker docker-common docker-selinux docker-engine
  • 安装需要的软件包
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  • 设置yum源
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • 查看仓库中所有docker版本
    yum list docker-ce --showduplicates | sort -r
    1
  • 安装docker
    sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    在这里插入图片描述
  • 启动并加入开机启动
    sudo systemctl start docker
    sudo systemctl enable docker
  • 验证安装是否成功
    sudo docker version
    在这里插入图片描述
  • 守护进程重启
    sudo systemctl daemon-reload
  • 重启docker服务
    sudo systemctl restart docker
  • 测试是否正确安装
    sudo docker run hello-world
    在这里插入图片描述
  • 测试
    sudo docker images
    sudo docker ps -a
    在这里插入图片描述
  • docker 仓库
    官网链接: https://hub.docker.com/.

5.sudo docker

使用docker的过程中,很多情况下都需要root权限才可以

  • 添加docker组,一般已存在
    sudo groupadd docker
  • 将登陆用户添加到docker组在
    sudo gpasswd -a xxxx docker
  • 更新用户组
    newgrp docker
  • 测试
    docker version

  • 或者一步到位
    sudo usermod -aG docker xxxx

6.configuration docker mirror

添加阿里云/中科大镜像,操作如下:
cd /etc/docker
sudo vim daemon.json

{
"registry-mirrors": ["https://ustc-edu-cn.mirror.aliyuncs.com"]
}

{
"registry-mirrors": ["https://gxeo3yz7.mirror.aliyuncs.com"]
}
  • 依次执行以下命令
    sudo systemctl daemon-reload
    sudo systemctl restart docker

7.docker image

  • 显示镜像
    docker images/docker image ls
  • 拉去镜像/版本
    docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    docker pull tomcat / docker pull tomcat:8
  • 搜索镜像
    docker search tomcat
  • 删除镜像(id,name)
    docker rmi tomcat

8.docker container

  • 显示正在运行的容器
    docker ps
  • 显示正在运行过的容器历史记录
    docker ps -a

  • 基于镜像创建一个容器并启动
    -i:保持和docker容器内的交互,启动容器时,运行的命令结束后,容器依然存活,没有退出。
    -t:为容器的标准输入虚拟一个tty。
    -d:守护进程,后台运行容器。
    –rm:容器启动后,执行完成命令或传给你续后销毁。
    –name:给容器自动以名称。
    -p:内部端口。前面是计算机端口,后面是docker内部端口
    docker run -d --name tomcat-8080 -p 8080:8080 tomcat
  • 停掉所有容器
    docker stop $(docker ps -a -q)
  • 停掉某个容器
    docker stop id/name
  • 启动某个容器
    docker start id/name

  • 删除某个容器/强制
    docker rm tomcat/docker rm -f tomcat
  • 删除所有容器
    docker rm $(docker ps -a -q)
  • linux开通防火墙
    firewall-cmd --list-ports
    firewall-cmd --zone=publish --add-port=8080/tcp --permanent
    firewall-cmd --zone=publish --add-port=8081/tcp --permanent
    firewall-cmd --reload

9.docker inner

  • 进入容器内部
    docker exec -it CONTAINER_ID bash
    docker exec -it CONTAINER_ID /bin/bash
  • 退出容器
    exit
  • 将容器的东西复制到宿主机
    docker cp containerName:path targetPath
    将html复制到宿主机的home下面
    docker cp tomcat_8081:/usr/local/tomcat/webapps/index.html /home
    将html复制到docker container下面
    docker cp index.html tomcat_8081:/usr/local/tomcat/webapps

  • 查看容器的操作系统
    cat /etc/issue
  • Alpine Linux
    1.更新本地宝版本
    apk update
    2.安装vim
    apk add vim
  • CentOS
    yum -y install vim
  • Ubuntu
    1.更新本地宝版本
    apt-get update
    2.安装vim
    apt-get install vim

10.docker log

docker logs [options] 容器获取容器的日志。

名字默认值描述
--details显示提供给日志的额外细节
--follow或-f按日志输出
--since从某个时间开始显示,例如2013-01-02T13:23:37
--tailall从日志末尾多少行开始显示
-t显示时间戳
--until打印某个时间以前的日志,例如 2013-01-02T13:23:37
  • 查看指定时间后的⽇志,只显⽰最后100⾏
    docker logs -f -t --since=“2018-02-08” --tail=100 CONTAINER_ID
  • 查看最近30分钟的⽇志
    docker logs --since 30m CONTAINER_ID
  • 查看某时间之后的⽇志
    docker logs -t --since=“2018-02-08T13:23:37” CONTAINER_ID
  • 查看某时间段⽇志
    docker logs -t --since=“2018-02-08T13:23:37” --until “2018-02-09T12:23:37” CONTAINER_ID

11.docker 数据卷

数据卷:是一个可供一个或多个容器使用的特殊目录

特性:

  • 数据卷可以在容器之间共享和使用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

数据卷的最大特点:其生存周期独立于容器的生存周期

  • 创建数据卷
    docker volume create xxxx
    默认数据卷会在/var/lib/docker/volumes下
    ls -l /var/lib/docker/volumes
    用数据卷创建
    docker run -d --name tomcat-8080 -p 8080:8080 -v xxxxx:/usr/local/tomcat/webapps/ROOT tomcat
    直接path创建
    docker run -d --name tomcat-8080 -p 8080:8080 -v /home/xxx/index.html:/usr/local/tomcat/webapps/ROOT tomcat

  • 查看数据卷
    docker volume inspect xxxx
  • 查看全部数据卷信息
    docker volume ls
  • 移除数据卷
    docker volume rm xxxx
    在这里插入图片描述

12.docker中的三剑客

docker中的三剑客是指swarm、compose和machine

  • compose是用来定义和运行一个或多个容器运行和应用的工具;
  • machine是一个简化Docker安装的命令行工具;
  • swarm是社区提供的原生支持Docker集群的工具。

12.1 compose

docker compose: https://github.com/docker/compose.

在实际生产环境中,一个应用往往由许多服务构成,而 docker 的最佳实践是一个容器只运行一个进程,因此运行多个微服务就要运行多个容器。多个容器协同工作需要一个有效的工具来管理他们,定义这些容器如何相互关联。compose 应运而生。


1.下载安装:
docker compose package download: https://github.com/docker/compose/releases.

  • 下载
    wget https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64
  • 移动
    mv docker-compose-Linux-x86_64 /usr/local/bin
  • 改名
    mv docker-compose-Linux-x86_64 docker-compose
  • 改权限
    chmod 777 docker-compose
  • 软链
    sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  • 版本
    docker-compose version

2.compose.yaml

  • 术语
    服务(service):一个应用容器,实际上可以运行多个相同镜像的实例
    项目(project):由一个关联的应用容器组成的一个完成业务单元

如果使用build指令,在Dockerfile中设置的选项(例如:CMD,EXPOSE,VOLUME,ENV等)将自动被获取,无需在docker-compose.yml中再次被设置。

docker compose config: https://www.runoob.com/docker/docker-compose.html.

1.image
指定为镜像名称或镜像ID。如果镜像不存在,Compose将尝试从互联网拉取这个镜像
2.build

指定Dockerfile所在文件夹的路径。Compose将会利用他自动构建这个镜像,然后使用这个镜像。 build: ./dir

3.command

覆盖容器启动后默认执行的命令。 command: bundle exec thin -p 3000

4.links

链接到其他服务容器,使用服务名称(同时作为别名)或服务别名(SERVICE:ALIAS)都可以

links:
- db
- db:database
- redis

注意:使用别名会自动在服务器中的/etc/hosts 里创建,如:172.17.2.186 db,相应的环境变量也会被创建。

5.external_links

链接到docker-compose.yml外部的容器,甚至并非是Compose管理的容器。参数格式和links类似。

external_links:
- redis_1
- project_db_1:mysql
- project_db_2:sqlserver
6.ports

暴露端口信息。 宿主机器端口:容器端口(HOST:CONTAINER)格式或者仅仅指定容器的端口(宿主机器将会随机分配端口)都可以。

ports:
- "3306"
- "8080:80"
- "127.0.0.1:8090:8001"

注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 你可能会得到错误得结果,因为 YAML 将会解析 xx:yy 这种数字格式为 60 进制。所以建议采用字符串格式。

7.expose

暴露端口,与posts不同的是expose只可以暴露端口而不能映射到主机,只供外部服务连接使用;仅可以指定内部端口为参数。

expose:
- "3000"
- "8000"
8.volumes

设置卷挂载的路径。可以设置宿主机路径:容器路径(host:container)或加上访问模式(host:container:ro)ro就是readonly的意思,只读模式。

volumes:
- /var/lib/mysql:/var/lib/mysql
- /configs/mysql:/etc/configs/:ro
9.volunes_from

挂载另一个服务或容器的所有数据卷。

volumes_from:
- service_name
- container_name
10.environment

设置环境变量。可以属于数组或字典两种格式。 如果只给定变量的名称则会自动加载它在Compose主机上的值,可以用来防止泄露不必要的数据。

environment:
- RACK_ENV=development
- SESSION_SECRET
11.env_file

从文件中获取环境变量,可以为单独的文件路径或列表。 如果通过docker-compose -f FILE指定了模板文件,则env_file中路径会基于模板文件路径。 如果有变量名称与environment指令冲突,则以后者为准。

env_file: .env
env_file:
- ./common.env
- ./apps/web.env
- /opt/secrets.env

环境变量文件中每一行都必须有注释,支持#开头的注释行。

# common.env: Set Rails/Rack environment
RACK_ENV=development
12.extends

基于已有的服务进行服务扩展。例如我们已经有了一个webapp服务,模板文件为common.yml.

# common.yml
webapp:
build: ./webapp
environment:
\ - DEBUG=false
\ - SEND_EMAILS=false

编写一个新的 development.yml 文件,使用 common.yml 中的 webapp 服务进行扩展。 development.yml

web:
extends:
file: common.yml
service: 
  webapp:
  	ports:
    	\ - "8080:80"
  	links:
    	\ - db
  	envelopment:
    	- DEBUG=true
  db:
 	image: mysql:5.7

后者会自动继承common.yml中的webapp服务及相关的环境变量。

13.net

设置网络模式。使用和docker client 的 --net 参数一样的值。

# 容器默认连接的网络,是所有Docker安装时都默认安装的docker0网络.
net: "bridge"
# 容器定制的网络栈.
net: "none"
# 使用另一个容器的网络配置
net: "container:[name or id]"
# 在宿主网络栈上添加一个容器,容器中的网络配置会与宿主的一样
net: "host"

Docker会为每个节点自动创建三个网络: 网络名称 作用 bridge 容器默认连接的网络,是所有Docker安装时都默认安装的docker0>网络 none 容器定制的网络栈 host 在宿主网络栈上添加一个容器,容器中的网络配置会与宿主的一样 附录:操作名称 命令 创建网络 docker network create -d bridge mynet 查看网络列表 docker network ls

14.pid

和宿主机系统共享进程命名空间,打开该选项的容器可以相互通过进程>id来访问和操作。

pid: class="hljs-string">"host"
15.dns
配置DNS服务器。可以是一个值,也可以是一个列表。
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
16.cap_add,cap_drop

添加或放弃容器的Linux能力(Capability)。

cap_add:
- ALL
cap_drop:
- NET_ADMIN
- SYS_ADMIN

docker-compose.yml实例

version: "3.0"
services:
  redis:
    restart: always            #docker启动,容器就跟着启动
    image: redis:alpine
    container_name: redis
    ports:
      - "6379"
    networks:
      - frontend
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
 
  db:
    image: postgres:9.4
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - backend
    deploy:
      placement:
        constraints: [node.role == manager]
 
  vote:
    image: dockersamples/examplevotingapp_vote:before
    ports:
      - 5000:80
    networks:
      - frontend
    depends_on:
      - redis
    deploy:
      replicas: 2
      update_config:
        parallelism: 2
      restart_policy:
        condition: on-failure
 
  result:
    image: dockersamples/examplevotingapp_result:before
    ports:
      - 5001:80
    networks:
      - backend
    depends_on:
      - db
    deploy:
      replicas: 1
      update_config:
        parallelism: 2
        delay: 10s
      restart_policy:
        condition: on-failure
 
  worker:
    image: dockersamples/examplevotingapp_worker
    networks:
      - frontend
      - backend
    deploy:
      mode: replicated
      replicas: 1
      labels: [APP=VOTING]
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 3
        window: 120s
      placement:
        constraints: [node.role == manager]
 
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    stop_grace_period: 1m30s
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
 
networks:
  frontend:
  backend:
 
volumes:
  db-data:

启动执行:docker-compose up -d
非默认文件名启动执行:docker-compose -f xxx.xxx up -d
关闭执行:docker-compose stop

12.2 machine

ocker Machine 是一个简化Docker 安装的命令行工具。通过一个简单的命令行即可在相应的平台上安装 Docker,为用户提供了灵活的功能,使得用户可以在任一主机上运行 Docker 容器。简单说,一个 Docker Machine 就是一个 Docker host 主机和经过配置的 Docker client 的结合体。

技术上讲, Machine 是一个框架,比较开放。对于任何提供虚拟机服务的平台,只要在这个框架下开发针对该平台的驱动,,Docker Machine 就可以集成到该平台,在该平台上执行创建、删除、启动、停止等行为。

在这里插入图片描述

12.3 swarm

Swarm 是 Docker 社区提供的原生支持 Docker 集群的工具。 它可以把多个 Docker 主机组成的系统转换成为单一的虚拟 Docker 主机。Swarm 对外提供两种 API。

  • 一种是标准的 Docker API,例如 Dokku、Compose、Krane、Flynn、Deis、Jenkins等;
  • 另一种是 Swarm 的集群管理 API,用于集群的管理。

13.docker定制镜像

  • 从已经存下的容器中更新镜像,并提交
  • 使用dockerfile指令来创建一个新的镜像

DockerFile template/centos

FROM centos
MAINTAINER xxxx<nolan@163.com>
ENV JAVA_HOME /usr/local/jdk_1.8/
WORKDIR /usr/local
RUN yum install -y vim
RUN yum install -y net-tools

EXPOSE 8080

CMD echo $JAVA_HOME
CMD echo "---end---"
CMD /bin/bash
指令语法说明
FROMFROM :指明构建的新镜像是来自于哪个基础镜像,如果没有选择tag,那么默认值为latest
MAINTAINERMAINTAINER 指明镜像维护者及其联系方式(一般是邮箱地址)。官方说明已过时,推荐使用LABEL
LABELLABEL = …功能是为镜像指定标签。也可以使用LABEL来指定镜像作者
RUNRUN 构建镜像时运行的Shell命令,比如构建的新镜像中我们想在/usr/local目录下创建一个java目录
ADDADD … 拷贝文件或目录到镜像中。src 可以是一个本地文件,还可以是一个url。然后自动下载和解压
COPYCOPY … 拷贝文件或目录到镜像中。用法同 ADD,只是不支持自动下载和解压
EXPOSEEXPOSE [/…]暴露容器运行时的监听端口给外部,可以指定端口是监听 TCP 还是 UDP,如果未指定协议,则默认为 TCP
ENVENV = …设置容器内环境变量
CMDCMD [“executable”,“param1”,“param2”]启动容器时执行的Shell命令。在Dockerfile中只能有一条CMD指令。如果设置了多条CMD,只有最后一条会生效
ENTRYPOINTENTRYPOINT [“executable”, “param1”, “param2”]启动容器时执行的 Shell 命令,同 CMD 类似,不会被 docker run 命令行指定的参数所覆盖,如果设置了多条ENTRYPOINT,只有最后一条会生效
WORKDIRWORKDIR param为 RUN、CMD、ENTRYPOINT 以及 COPY 和 AND 设置工作目录
VOLUMEVOLUME [“param”]指定容器挂载点到宿主机自动生成的目录或其他容器。一般的使用场景为需要持久化存储数据时

-t:构建镜像的名称
最后面的点:表示同级目录
规范命名Dockerfile:docker build -t mycentos:1.0 .
不规范命名执行:docker build -f xxxxx -t mycentos:1.0 .

14.docker开启远端访问

1.修改docker.service

#进入配置文件
vim /etc/systemd/system/docker.service
#找到下面的命令
ExecStart=/usr/local/bin/dockerd
#修改为
ExecStart=/usr/local/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock

2.重启docker

systemctl daemon-reload
systemctl restart docker

3.curl访问

curl http://localhost:2375/version

4.通过 http 访问

http://xx.xx.xx.xx:2375/version

15.docker自启,container自启

  • docker开机启动
    systemctl enable docker

  • 创建容器时自启
    --restart具体参数值详细信息:
    • no       // 默认策略,容器退出时不重启容器;
    • on-failure   // 在容器非正常退出时(退出状态非0)才重新启动容器;
    • on-failure:3 // 在容器非正常退出时重启容器,最多重启3次;
    • always     // 无论退出状态是如何,都重启容器;
    • unless-stopped // 在容器退出时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了的容器。
  • docker run -d --restart=always --name containerName -p port imageName
    docker run -d --restart=always --name tomcat-8080 -p 8080:8080 tomcat
  • 更新设定
    docker update --restart=always containerId/containerName
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百世经纶『一页書』

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值