Docker安装及学习

安装Docker

Docker 分为 CE 和 EE 两大版本。CE 即社区版(免费,支持周期 7 个月),EE 即企业版,强调安全,付费使用,支持周期 24 个月。

Docker CE 分为 stable test 和 nightly 三个更新频道。

官方网站上有各种环境下的 安装指南,这里主要介绍 Docker CE 在 CentOS上的安装。

1.CentOS安装Docker

Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10, CentOS 7 满足最低内核的要求,所以我们在CentOS 7安装Docker。

 

1.1.卸载(可选)

如果之前安装过旧版本的Docker,可以使用下面命令卸载:

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine \
                  docker-ce

 

1.2.安装docker

首先需要大家虚拟机联网,安装yum工具

yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2 --skip-broken

 

然后更新本地镜像源:

# 设置docker镜像源
yum-config-manager \
    --add-repo \
    https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
​
yum makecache fast

 

 

然后输入命令:

yum install -y docker-ce

docker-ce为社区免费版本。稍等片刻,docker即可安装成功。

 

1.3.启动docker

Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!

启动docker前,一定要关闭防火墙后!!

启动docker前,一定要关闭防火墙后!!

启动docker前,一定要关闭防火墙后!!

 

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

 

通过命令启动docker:

systemctl start docker  # 启动docker服务
​
systemctl stop docker  # 停止docker服务
​
systemctl restart docker  # 重启docker服务

 

然后输入命令,可以查看docker版本:

docker -v
1.4.配置镜像加速

docker官方镜像仓库网速较差,我们需要设置国内镜像服务:

参考阿里云的镜像加速文档:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

 

 

2.CentOS7安装DockerCompose

 

2.1.下载

Linux下需要通过命令下载:

# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

上传到/usr/local/bin/目录也可以。

 

2.2.修改文件权限

修改文件权限:

# 修改权限
chmod +x /usr/local/bin/docker-compose

 

 

2.3.Base自动补全命令:
# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里出现错误,需要修改自己的hosts文件:

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

 

 

3.Docker镜像仓库

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。

官网地址:https://hub.docker.com/_/registry

 

3.1.简化版镜像仓库

Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。

搭建方式比较简单,命令如下:

docker run -d \
    --restart=always \
    --name registry \
    -p 5000:5000 \
    -v registry-data:/var/lib/registry \
    registry

 

命令中挂载了一个数据卷registry-data到容器内的/var/lib/registry 目录,这是私有镜像库存放数据的目录。

访问http://YourIp:5000/v2/_catalog 可以查看当前私有镜像服务中包含的镜像

 

3.2.带有图形化界面版本

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

version: '3.0'
services:
  registry:
    image: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=传智教育私有仓库
      - REGISTRY_URL=http://registry:5000
    depends_on:
      - registry

 

3.3.配置Docker信任地址

我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker

 

Docker

容器数据卷

坑!!

Docker挂在主机目录访问如果出现权限不足提示

解决办法:在挂载目录后多加一个 --privileged=true

介绍

  • 容器数据卷的方式,可以完成数据的持久化重要资料backup

  • 映射,容器内的数据备份+持久化到本机的目录中

  • 有点类似redis中的rdb ref

是什么

卷就是目录或者文件,存在于一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System 提供一些用于持续存储或共享数据的特征

卷的设计就是数据的持久化,完全独立于容器的生命周期,因此Docker不会在容器中删除时删除其挂载的数据卷

能干嘛

将运用与运行环境打包镜像,run后形成容器实例运行,但是我们对数据的要求时持久化的

Docker容器产生的数据,如果不备份,那么当容器删除之后,容器内的数据自然也就没有了

为了能保存数据,我们使用数据卷

特点

  • 数据卷可以在容器之间共享或重用

  • 卷中的更改直接实时生效

  • 数据卷中的更改不会包含在镜像的更新中

  • 数据卷的生命周期一直持续到没有容器使用为止

 

怎么用

#挂载
docker run -it   --privileged=true -v /宿主机绝对路径目录:/容器内目录[:rw]    镜像名
​
#查看数据卷是否挂载成功
deocker inspect 容器id
​
#数据卷之间的继承
docker run -it  --privileged=teue  from 子名字 --name  父名字
​

 

数据卷和容器文件的读写规则

  • [:rw] 宿主机和容器都可读可写

  • [:ro] 宿主机可读可写,容器只可读

 

DockerFile

介绍

Dockfile是一种被Docker程序解释的脚本, Dockerfile由一条一条的指令组成,每条指令对应Linux下面的一条命令。Docker程序将这些Dockerfile指令翻译真正的Linux命令。 Dockerfile有自己书写格式和支持的命令, Docker程序解决这些命令间的依赖关系,类似于Makefile, Docker程序将读取Dockerfile,根据指令生成定制的image。

Dockerfile的指令是忽略大小写的,建议使用大写,使用#作为注释,每一行只支持一条指令 每条指令可以携带多个参数。

Dokerfile的指令根据作用可以分为两种, 构建指令和设置指令。构建指令用于构建 image,其指定的操作不会在运行image的容器上执行;设置指令用于设置image的属性,其指定的操作将在运行image的容器中执行。

 

是什么

Dockerfile是由一些列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像

能干嘛

  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境;

  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;

  • 对于运维人员:在部署时,可以实现应用的无缝移植。

Dockerfile 的书写规则及指令使用方法

1、FROM(指定基础image)
    # 构建指令,必须指定且需要在Dockerfile其他指令的前面。后续的指令都依赖于该指令指定的image。FROM指令指定的基础image可以是官方远程仓库中的,也可以位于本地仓库的tag版本。
    FROM <image>:<tag>

   FROM hub.c.163.com/netease_comb/debian:7.9

2、USER (设置指令,设置启动容器的用户,默认是root用户)
   # 指定memcached的运行用户
   ENTRYPOINT ["memcached"]
   USER daemon
  或
   ENTRYPOINT ["memcached", "-u", "daemon"]

3、MAINTAINER(用来指定镜像创建者信息)
   # 构建指令,用于将image的制作者相关的信息写入到image中。当我们对该image执行docker inspect命令时,输出中有相应的字段记录该信息。
   MAINTAINER <name>

   MAINTAINER Alenx

4、RUN(安装软件用)
   # 构建指令,RUN可以运行任何被基础image支持的命令。如基础image选择了ubuntu,那么软件管理部分只能使用ubuntu的命令。
   RUN <command> (the command is run in a shell - /bin/sh -c)
   RUN ["executable", "param1", "param2" ... ] (exec form)

   RUN apt-get install -y openssh-server apt-utils tomcat7
   RUN rm -rf /var/lib/apt/lists/*

5、CMD(设置container启动时执行的操作)
   # 设置指令,用于container启动时指定的操作。该操作可以是执行自定义脚本,也可以是执行系统命令。该指令只能在文件中存在一次,如果有多个,则只执行最后一条。
   CMD ["executable","param1","param2"] (like an exec, this is the preferred form)
   CMD command param1 param2 (as a shell)
   CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

   CMD echo hello world

6、ENTRYPOINT(设置container启动时执行的操作)
   # 设置指令,指定容器启动时执行的命令,可以多次设置,但是只有最后一个有效
   # 该指令的使用分为两种情况,一种是独自使用,另一种和CMD指令配合使用。当独自使用时,如果你还使用了CMD命令且CMD是一个完整的可执行的命令,那么CMD指令和ENTRYPOINT会互相覆盖只有最后一个CMD或者ENTRYPOINT有效。
   ENTRYPOINT ["executable", "param1", "param2"] (like an exec, the preferred form)
   ENTRYPOINT command param1 param2 (as a shell)

   # CMD指令将不会被执行,只有ENTRYPOINT指令被执行
   CMD echo “Hello, World!”
   ENTRYPOINT ls -l

   # 另一种用法和CMD指令配合使用来指定ENTRYPOINT的默认参数,这时CMD指令不是一个完整的可执行命令,仅仅是参数部分;ENTRYPOINT指令只能使用JSON方式指定执行命令,而不能指定参数
   FROM ubuntu
   CMD ["-l"]
   ENTRYPOINT ["/usr/bin/ls"]

7、EXPOSE(指定容器需要映射到宿主机器的端口)
  """
      设置指令,该指令会将容器中的端口映射成宿主机器中的某个端口。当你需要访问容器的时候,可以不是用容器的IP地址而是使用宿主机器的IP地址和映射后的端口。
      要完成整个操作需要两个步骤,首先在Dockerfile使用EXPOSE设置需要映射的容器端口,然后在运行容器的时候指定-p选项加上EXPOSE设置的端口,这样EXPOSE设置的端口号会被随机映射成宿主机器中的一个端口号。
      也可以指定需要映射到宿主机器的那个端口,这时要确保宿主机器上的端口号没有被使用。EXPOSE指令可以一次设置多个端口号,相应的运行容器的时候,可以配套的多次使用-p选项。
      端口映射是docker比较重要的一个功能,原因在于我们每次运行容器的时候容器的IP地址不能指定而是在桥接网卡的地址范围内随机生成的。
      宿主机器的IP地址是固定的,我们可以将容器的端口的映射到宿主机器上的一个端口,免去每次访问容器中的某个服务时都要查看容器的IP的地址。
      对于一个运行的容器,可以使用docker port加上容器中需要映射的端口和容器的ID来查看该端口号在宿主机器上的映射端口
  """
   EXPOSE <port> [<port>...]

   # 映射一个端口
   EXPOSE port1
   # 相应的运行容器使用的命令
  docker run -p port1 image
   # 映射多个端口
   EXPOSE port1 port2 port3
   # 相应的运行容器使用的命令
  docker run -p port1 -p port2 -p port3 image
   # 还可以指定需要映射到宿主机器上的某个端口号
  docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
  docker run -d -p 127.0.0.1:33301:22 centos6-ssh

8、ENV(用于设置环境变量)
   # 构建指令,在image中设置一个环境变量
   ENV <key> <value>

   # 设置了后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量,也可以通过在docker run --env key=value时设置或修改环境变量。
   # 假如你安装了JAVA程序,需要设置JAVA_HOME,那么可以在Dockerfile中这样写:
   ENV JAVA_HOME /path/to/java/dirent

9、ADD(从src复制文件到container的dest路径
  """
      构建指令,所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0;如果是一个目录,那么会将该目录下的所有文件添加到container中,不包括目录;
      如果文件是可识别的压缩格式,则docker会帮忙解压缩(注意压缩格式);如果<src>是文件且<dest>中不使用斜杠结束,则会将<dest>视为文件,<src>的内容会写入<dest>;
      如果<src>是文件且<dest>中使用斜杠结束,则会<src>文件拷贝到<dest>目录下
  """
   ADD <src> <dest>
   # <src> 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件url;
   # <dest> 是container中的绝对路径

10、VOLUME(指定挂载点)
  """
      设置指令,使容器中的一个目录具有持久化存储数据的功能,该目录可以被容器本身使用,也可以共享给其他容器使用。
      我们知道容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当容器中的应用有持久化数据的需求时可以在Dockerfile中使用该指令。
  """
   VOLUME ["<mountpoint>"]

   FROM base
   VOLUME ["/tmp/data"]

11、WORKDIR(切换目录)
   # 设置指令,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效。
   WORKDIR /path/to/workdir

   # 在 /p1/p2 下执行 vim a.txt
   WORKDIR /p1 WORKDIR p2 RUN vim a.txt

12、ONBUILD(在子镜像中执行)
   # ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行
   ONBUILD <Dockerfile关键字>

 

Docker网络

简介

docker启动的时候,会在后台启动一个docker0的虚拟网桥,使用ifconfig可以查看

使用docker0来进行宿主机和容器之间的网路通信

网络命令模式

当我们安装docker后,默认会自动创建三个网络
​
#查看docker网络命令
docker  network  ls
​
#查看网络数据源
docker  network  inspect  name
​
#删除网络
docker  network  rm  name
​
​

能干嘛

  • 容器间的互联和通信以及端口映射

  • 容器ip变动的时候可以通过服务名直接网络通信而不受影响

网络模式

  • bridge模式:使用 --network bridge指定 ,默认使用docker0

为每一个容器分配、设置IP等,并将容器连接到一个docker0

  • host模式:使用 --network host指定

容器不会虚拟出自己的网卡,配置自己的ip等,而是使用宿主机的IP和端口

  • none模式:使用 --network none指定

容器由独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,IP等

  • container模式:使用 --network container:NAME或者容器ID指定

新创建的容器不会创建自己的网卡和配置自己的IP,而是指定一个容器共享IP、端口范围

Docker-Compose

是什么

是Docker官方的开源项目,负责实现对Docker容器集群的快速编排

可以管理多个Docker容器组成一个应用,需要定义一个YAML格式的配置文件 docker-compose.yml

写多个容器之间的调用关系,然后只需要下一个命令,就能同时启动/关闭这些容器

能干嘛

Compose允许用户通过一个单独的docker-compose.yml来定义一组相关联的应用容器为一个项目

可以很容易用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建

Docker-Compose解决了容器与容器黄子健的如果管理编排的问题

Compose核心概念

 

Compose常用命令

# 查看帮助
docker-compose  -h
​
# 启动所有docker-compose服务
docker-compose  up 
​
# 启动所有的docker-compose服务并后台运行
docker-compose  up
​
# 停止并删除容器、网络、卷、镜像
docker-compose down
​
# 进入容器实例内部
docker-compose  exec  yml中的服务id  /bin/bash
​
# 展示当前docker-compose编排过得运行所有容器
docker-compose  ps
​
# 展示当前docker-compose编排过的容器进程
docker-compose  top
​
# 查看容器输出日志
docker-compose  logs  yml中的服务id
​
# 检查配置
docker-compose  config
​
# 检查配置 只输出有问题的
docker-compose  config  -q
​
# 重启服务
docker-compose  restart
​
# 启动服务
docker-compose  start
​
# 停止服务
docker-compose  stop

 

常规命令

启动 Docker

sudo systemctl start docker

停止 Docker

sudo systemctl stop docker

重启 Docker

sudo systemctl restart docker

修改配置后重启 Docker

sudo systemctl daemon-reload
sudo systemctl restart docker

查看版本

docker version

查看Docker 信息

docker info

Docker 帮助

docker --help

 

镜像命令

查看Docker上已经安装的镜像

docker images

搜索Docker hub上面的镜像

docker search tomcat

下载镜像

docker pull tomcat[:version]

删除镜像

# 以删除tomcat为例
docker rmi tomcat[:version]
# 通过镜像ID删除
docker rmi -f 镜像ID
# 通过镜像ID删除多个
docker rmi -f 镜像名1:TAG 镜像名2:TAG 
# 删除全部
# docker images -qa : 获取所有镜像ID
docker rmi -f $(docker images -qa)

容器命令

运行一个容器

docker run [options] image [command] [arg...]
​
​
常用参数:
-d: 后台运行容器,并返回容器ID
​
-i: 以交互式运行容器,通常与-t同时使用
​
-p: 端口映射,格式为 主机(宿主)端口:容器端口
​
-t: 为容器重新分配一个伪输入终端,通常与-i同时使用
​
--name="name": 为容器指定一个名称
​
--dns 8.8.8.8: 为容器指定一个dns服务器,默认与宿主一致
​
--dns-search domain:为容器指定一个DNS域名,默认与宿主一致
​
-h "hostname": 指定容器的hostname
​
-e arg="value": 设置环境变量
​
-env-file=[]:从指定文件读入环境变量
​
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定的cpu运行
​
-m: 设置容器使用内存最大值
​
--net="bridge": 指定容器的网络连接类型,支持bridge/host/none/container四种类型
​
--link=[]:添加链接到另外一个容器
​
--expose=[]:开放一个端口或一组端口,宿主机使用随机端口映射到开放的端口

实例:

docker run --name mynginx -d nginx:latest
# 映射多个端口
docker run -p 80:80/tcp -p 90:90 -v /data:/data -d nginx:latest

查看正在运行的Docker 容器

docker ps
​
常用参数:
# 显示所有容器,包括当前没有运行的容器
-a
# 显示最近创建的容器
-l
# 显示最近创建的N个容器
-n
# 静默模式,只显示容器ID
-q
# 不截断输出
--no-trunc

退出容器

# 微信公众号:ITester软件测试小栈
# 退出并停止
exit
# 容器不停止退出
ctrl+P+Q

启动一个已经停止的容器

docker start 容器ID或容器name

重启容器

docker restart 容器ID或容器name

停止容器

docker stop 容器ID或容器name

强制停止容器

docker kill 容器ID或容器name

删除容器

# 删除已经停止的容器
docker rm 容器ID或容器name 
# 强制删除已经停止或正在运行的容器
docker rm -f  容器ID或容器name 
#一次性删除所有正在运行的容器
docker rm -f $(docker ps -qa)

从容器拷贝文件到宿主机

docker cp 容器ID或容器名称:/文件路径与文件名 宿主机地址
实例:
拷贝容器coco的tmp文件夹下的info.txt到宿主机的当前位置
docker cp coco:/tmp/info.txt .

日志命令

docker logs -f -t --tail 10 容器ID或容器名称

参数说明:

# 加入时间戳
-t
# 跟随最新的日志打印
-f
# 输出最后几行的日志
--tail 行数

实例:

docker logs -f -t --tail 10 5b66c8ab957e

 

 

 

 

 

posted @ 2022-03-06 20:52  断了片了  阅读(77)  评论(0编辑  收藏  举报