Skip to content

FYKANG/docker_note

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

32 Commits
 
 
 
 
 
 

Repository files navigation

DOCKER 笔记

目录

  1. 参考资料

  2. docker简介

  3. docker安装

  4. 使用镜像

  5. 镜像定制

  6. 容器的使用

  7. 镜像的推送

  8. 常用命令

  9. 关于CentOS7配置阿里云加速镜像(用官方文档方法失败的话可以用这个方法试试)

  10. 关于配置jenkins要使用的dockerURL连接(使用安全的TLS方式部署)

  11. docker中更新jenkins

参考资料

docker简介

  • 什么是Docker
    • Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup, namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。
  • Docker的优势
    • 更高效的利用系统资源
    • 更快速的启动时间
    • 一致的运行环境
    • 持续交付和部署
    • 更轻松的迁移
    • 更轻松的维护和扩展

docker安装

  • 安装依赖包

      $sudo yum install -y yum-utils\device-mapper-persistent-data\lvm2
    
  • 更新 yum 软件源缓存,并安装 docker-ce

    $sudo yum makecache fast
    $sudo yum install docker-ce
    
  • 启动 Docker CE

    $sudo systemctl enable docker
    $sudo systemctl start docker
    
  • 测试 Docker 是否安装正确(输出以下信息这表示启动成功)

    $ docker run hello-world
    Unable to find image 'hello-world:latest' locally
    latest: Pulling from library/hello-world
    9bb5a5d4561a: Pull complete
    Digest: sha256:f5233545e43561214ca4891fd1157e1c3c563316ed8e237750d59bde73361e77
    Status: Downloaded newer image for hello-world:latest
    
    Hello from Docker!
    This message shows that your installation appears to be working correctly.
    
    To generate this message, Docker took the following steps:
    1. The Docker client contacted the Docker daemon.
    2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
        (amd64)
    3. The Docker daemon created a new container from that image which runs the
        executable that produces the output you are currently reading.
    4. The Docker daemon streamed that output to the Docker client, which sent it
        to your terminal.
    
    To try something more ambitious, you can run an Ubuntu container with:
    $ docker run -it ubuntu bash
    
    Share images, automate workflows, and more with a free Docker ID:
    https://hub.docker.com/
    
    For more examples and ideas, visit:
    https://docs.docker.com/engine/userguide/
    
  • 国内镜像加速设置

    • Ubuntu 16.04+、Debian 8+、CentOS 7

      • 对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
      {
        "registry-mirrors": [
          "https://registry.docker-cn.com"
        ]
      }
      • 重新启动服务
      $sudo systemctl daemon-reload
      $sudo systemctl restart docker
      
      • 生效测试
      $docker info
      
      
  • 注意事项

    • 默认情况下,docker 命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

      • 建立 docker 组:
      $sudo groupadd docker
      
      Registry Mirrors:
      https://registry.docker-cn.com/
      
      
      • 将当前用户加入 docker 组:
      $sudo usermod -aG docker $USER
      

使用镜像

  • 镜像获取
$docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
  • 查询镜像
docker image ls

查询镜像

  • 使用Dockerfile定制镜像

    • 在一个空白目录中,建立一个文本文件,并命名为 Dockerfile:
    $mkdir mynginx
    $cd mynginx
    $vi Dockerfile
    
    • 内容
    FROM nginx
    RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    
    • 构建镜像

      • 在 Dockerfile 文件所在目录执行:
      $docker build -t nginx:v1 .
      
    • 注意事项

      1. 每一个run都会构建一层镜像,只构建一层镜像的多语句执行语法
      FROM debian:jessie
      
      RUN yum vim
          && yum  install git
      
  • Dockerfile命令

    • COPY 复制文件

      • COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。
      COPY <源路径>... <目标路径>
      COPY ["<源路径1>",... "<目标路径>"]
      COPY package.json /usr/src/app/
      
      • <目标路径> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径
    • ADD 更高级的复制文件

      • 语法与COPY基本保持一致
      • 在下载url资源中如有tar,gzip, bzip2 以及 xz格式压缩包将会自动解压
      • 除需自动解压的场景外,并不推荐使用
      • 注意:ADD 指令会令镜像构建缓存失效,从而可能会令镜像构`建变得比较缓慢。
    • CMD 容器启动命令

      • shell 格式:CMD <命令>
      • exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
      • 参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
      • 注意:区分主进程,当主进程进程结束后容器退出,使用shell格式时主进程为sh
    • ENTRYPOINT 入口点

      • 用于带参启动
      • ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
    • ENV 设置环境变量

      • ENV <key> <value>
      • ENV <key1>=<value1> <key2>=<value2>...
    • ARG 构建参数

      • 与ENV相同用于设置环境变量
      • Dockerfile 中的 ARG 指令是定义参数名称,以及定义其默认值。该默认值可以在构建命令 docker build 中用 --build-arg <参数名>=<值> 来覆盖。
    • VOLUME 定义匿名卷

      • VOLUME ["<路径1>", "<路径2>"...]
      • VOLUME <路径>
      • 示例
        --volume /opt/gitlab/config:/etc/gitlab #将容器中的/etc/gitlab挂载到宿主机中的/opt/gitlab/config目录
        
      • 对于数据库类需要保存动态数据的应用,其数据库文件应该保存于卷(volume)中
    • EXPOSE 声明端口

      • 格式为 EXPOSE <端口1> [<端口2>...]
      • 注意 要将 EXPOSE 和在运行时使用 -p <宿主端口>:<容器端口> 区分开来。-p,是映射宿主端口和容器端口,换句话说,就是将容器的对应端口服务公开给外界访问,而 EXPOSE 仅仅是声明容器打算使用什么端口而已,并不会自动在宿主进行端口映射。
    • WORKDIR 指定工作目录

      • WORKDIR <工作目录路径>
      • 适用场景:进入下层容器时改变工作目录(cd命名在当层容器目录改变后进入下层容器时不会有效)
    • USER 指定当前用户

      • USER <用户名>
      • 注意 这个用户必须是事先建立好的,否则无法切换。
    • HEALTHCHECK 健康检查

      • HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
      • HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
      • HEALTHCHECK 支持下列选项:
        • --interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
        • --timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
        • --retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
    • ONBUILD

      • ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

容器的使用

  • 启动容器

    • 启动一个 bash 终端,允许用户进行交互。
    $docker run -t -i ubuntu:14.04
    
    • 其中,-t 选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上, -i 则让容器的标准输入保持打开。在交互模式下,用户可以通过所创建的终端来输入命令,例如
    • 当利用 docker run 来创建容器时,Docker 在后台运行的标准操作包括:
      • 检查本地是否存在指定的镜像,不存在就从公有仓库下载
      • 利用镜像创建并启动一个容器
      • 分配一个文件系统,并在只读的镜像层外面挂载一层可读写层
      • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
      • 从地址池配置一个 ip 地址给容器
      • 执行用户指定的应用程序
      • 执行完毕后容器被终止
    • 启动已终止容器 docker container start
  • 后台运行

    • 通过添加 -d 参数来实现 docker run -d ubuntu:17.10
    • 使用 -d 参数启动后会返回一个唯一的 id,也可以通过 docker container ls 命令来查看容器信息。
    • 要获取容器的输出信息,可以通过 docker container logs 命令。
  • 终止容器

    • docker container stop
    • 进行交互中的容器退出使用exitCtrl+d
    • 终止状态的容器可以用 docker container ls -a 命令查看
    • 重启容器docker container restart
  • 进入容器

    • docker attach 243c其中的243c可以通过docker container ls查询获的CONTAINER ID
    • docker exec 后边可以跟多个参数。
      • 只使用-i 参数,没有分配伪终端,无Linux 命令提示符,但命令执行结果仍然可以返回。
      • -i -t参数一起使用时,有 Linux 命令提示符
      • 更多参数可查看docker exec --help
      • 注意 如果从这个 stdin 中 exit,不会导致容器的停止。
  • 导出和导入容器

    • 导出容器 docker export
      $ docker container ls -a
      CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
      7691a814370e        ubuntu:14.04        "/bin/bash"         36 hours ago        Exited (0) 21 hours ago                       test
      $ docker export 7691a814370e > ubuntu.tar
      
    • 导入容器快照 docker import
      $ cat ubuntu.tar | docker import - test/ubuntu:v1.0
      $ docker image ls
      REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
      test/ubuntu         v1.0                9d37a6082e97        About a minute ago   171.3 MB
      
  • 删除容器

    • docker container rm 容器名称
    • 清理所有处于终止状态的容器 $ docker container prune

镜像的推送

  • 登录私有仓库(以阿里云仓库为例)
docker login --username=***** registry.cn-shengzhen.aliyuncs.com
  • 标记 TAG
sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/ykthink/fire:[镜像版本号]
  • 推送镜像
sudo docker push registry.cn-shenzhen.aliyuncs.com/ykthink/fire:[镜像版本号]

常用命令

  • sudo docker inspect 容器 #查看容器配置信息
  • sudo docker logs 容器 #查看容器日志

关于CentOS7配置阿里云加速镜像(用官方文档方法失败的话可以用这个方法试试)

  • 编辑
vim /etc/sysconfig/docker
  • 修改--registry-mirror=你的镜像地址
OPTIONS='--selinux-enabled --log-driver=journald --registry-mirror=http://xxx.xxx.io'

关于配置jenkins要使用的dockerURL连接(使用安全的TLS方式部署)

  • 配置服务器公钥与密钥($HOST部分请用自己的ip地址代替)
$ openssl genrsa -aes256 -out ca-key.pem 4096       # 生成CA私钥
#生成CA公钥,也就是证书(注意:Common Name (e.g. server FQDN or YOUR name) []:$HOST)
$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
$ openssl genrsa -out server-key.pem 4096       # 生成服务器私钥
$ openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr  # 用私钥生成证书请求文件
$ echo subjectAltName = IP:$HOST,IP:127.0.0.1 > extfile.cnf
# 将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证:
$ echo extendedKeyUsage = serverAuth >> extfile.cnf
$ openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
  • 配置客户端证书
$ openssl genrsa -out key.pem 4096      # 客户端私钥
$ openssl req -subj '/CN=client' -new -key key.pem -out client.csr      # 客户端证书请求文件
# 要使密钥适配客户端身份验证,请创建扩展配置文件:
$ echo extendedKeyUsage = clientAuth >> extfile.cnf
$ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
# 删除证书请求文件:
$ rm -v client.csr server.csr
# 默认的私钥权限太开放了,为了更加的安全,我们需要更改证书的权限,删除写入权限,限制阅读权限(只有你能查看):
$ chmod -v 0400 ca-key.pem key.pem server-key.pem
# 证书文件删除其写入权限:
$ chmod -v 0444 ca.pem server-cert.pem cert.pem
  • 证书部署
# centos
$ sudo vi /etc/sysconfig/docker
    如:OPTIONS='--selinux-enabled --log-driver=journald --tlsverify=true'
    DOCKER_CERT_PATH=/etc/docker
$ sudo service docker restart


# daemon.json
$ sudo vi /etc/docker/daemon.json
{
  "tlsverify": true,
  "tlscert": "/var/docker/server-cert.pem",
  "tlskey": "/var/docker/server-key.pem",
  "tlscacert": "/var/docker/ca.pem",
  "hosts": [
    "tcp://0.0.0.0:2376",
    "unix:///var/run/docker.sock"
  ]
}
# 启动守护进程
$ dockerd
  • 配置jenkin
  • 在系统管理->系统设置->cloud-> Docker Host UR填写 tcp://主机ip:2376
  • 配置 Server credentials
  • 选择类型Docker Host Certificate Authentication,将生成的证书如下图填写 Server credentials配置

docker中更新jenkins

  • 在服务器中下载jenkins的最新war包 wget http://mirrors.jenkins.io/war/latest/jenkins.war
  • 将下载的war包cp至容器的usr/download目录中 docker cp jenkins.war ContainerId:/usr/download
  • 进入容器 docker exec -it ContainerId /bin/bash
  • 查看容器中jenkins war包的位置,并备份原来的war包
whereis jenkins
cd /usr/share/jenkins
cp jenkins.war jenkinsBAK.war
  • 将usr/dowanload下的包cp到/usr/share/jenkins下覆盖 cp /usr/download/jenkins.war /usr/share/jenkins
  • 重启jenkins,更新到新版本 docker restart ContainerId

About

DOCKER 笔记

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors