Centos7 Docker安装

Centos7 Docker安装

Scroll Down

1.安装VMWare14虚拟机(Windows下)

2.安装Centos7.iso

如何将yum源修改成国内的源?

1.首先备份原有的源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak

2.获取阿里yum源文件

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

3.更新源文件

yum makecache

3.安装docker

官方网站上有各种环境下的 安装指南,本文的主要介绍 Docker CE在Centos7安装
Centos官方指南

文档中所用到指令CLIS

3.1Centos安装Docker

3.1.1准备工作

Docker CE 支持 64 位版本 CentOS7,并且要求内核版本不低于 3.10。 CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2存储层驱动)无法使用,并且部分功能可能不太稳定。

鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。

3.1.2执行下面的命令添加yum软件源

sudo yum-config-manager \
    --add-repo \
    https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

3.1.3使用脚本自动安装

在测试或开发环境中 Docker 官方为了简化安装流程,提供了一套便捷的安装脚本,CentOS 系统上可以使用这套脚本安装

curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

3.1.4启动 Docker CE

sudo systemctl enable docker
sudo systemctl start docker

3.1.5测试 Docker 是否安装正确

docker version
docker run hello-world 或者 sudo docker run hello-world

当你出现以下

[[email protected] ~]# docker version
Client:
 Version:           18.09.5
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        e8ff056
 Built:             Thu Apr 11 04:43:34 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.5
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.8
  Git commit:       e8ff056
  Built:            Thu Apr 11 04:13:40 2019
  OS/Arch:          linux/amd64
  Experimental:     false
[[email protected] ~]# sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:92695bc579f31df7a63da6922075d0666e565ceccad16b59c3374d2cf4e8e50e
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/get-started/

说明安装成功

3.2 卸载docker

3.2.1卸载旧版本

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

3.2.2 卸载Docker CE

卸载Docker包

sudo yum remove docker-ce

主机上的图像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷

sudo rm -rf /var/lib/docker

3.3镜像加速器

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,强烈建议安装 Docker 之后配置

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器【注意:如果没有docker/daemon.json则新建】

阿里云镜像加速器入口

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://i27azkms.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
"registry-mirrors": [
    "https://registry.docker-cn.com"
  ]

3.4检查加速器是否生效

配置加速器之后,如果拉取镜像仍然十分缓慢,请手动检查加速器配置是否生效,在命令行执行

docker info

如果配置成功效果如下

Registry Mirrors:
 https://i27azkms.mirror.aliyuncs.com/

4. Docker镜像

可以从官网hub.docker或者国内的daoCloud查看高质量的镜像可以用

4.1 Docker获取镜像

指令 docker pull 格式如下

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

具体的选项可以通过 docker pull --help 命令看到。

这里我们说一下镜像名称的格式:

Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]

默认地址是 Docker Hub

仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>

对于Docker Hub,如果不给出用户名,则默认为 library也就是官方镜像

官方示例docker pull

本案例如下

[[email protected] docker]# docker pull centos:7
7: Pulling from library/centos
8ba884070f61: Pull complete 
Digest: sha256:8d487d68857f5bc9595793279b33d082b03713341ddec91054382641d14db861
Status: Downloaded newer image for centos:7

4.1.1 运行

指令格式如下

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

本案例

docker run -it --rm \
    centos:7 \
    bash

docker run运行容器的命令

  • -it两个参数 , -i 表示即使没有连接,也要保持STDIN打开(交互式操作), -t 分配伪TTY(终端)
  • --rm退出时自动删除容器
  • centos:7这是指用centos:7镜像为基础来启动容器
  • base放在镜像名后的是命令,这里我们希望有个交互式 Shell

效果如下

[[email protected] docker]#  docker run -it --rm \
>     centos:7 \
>     bash
[[email protected] /]# ifconfig
bash: ifconfig: command not found
[[email protected] /]# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

退出 exit或者ctrl+D

4.2Docker 列出镜像

要想列出已经下载下来的镜像,可以使用 docker image ls或者docker images命令

[[email protected] docker]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              7                   9f38484d220f        5 weeks ago         202MB
hello-world         latest              fce289e99eb9        3 months ago        1.84kB
  • REPOSITORY 仓库名
  • TAG标签
  • IMAGE ID 镜像 ID
  • CREATED 创建时间
  • SIZE 所占用的空间

4.2.1 虚悬镜像

上面的镜像列表中,还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 <none>,
一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除

docker image prune

4.2.2 中间层镜像

为了加速镜像构建、重复利用资源,Docker 会利用 中间层镜像,
默认的 docker image ls 列表中只会显示顶层镜像, 需要加 -a 参数

docker image ls -a

4.3 删除镜像

如果要删除本地的镜像,可以使用 docker image rm 命令,其格式为

docker image rm [选项] <镜像1> [<镜像2> ...]

4.3.1 用 ID、镜像名、摘要删除镜像

其中 镜像 可以用 镜像短 ID 镜像长 ID 镜像名以及镜像摘要

4.4 Dockerfile 定制镜像

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

4.4.1 Dockerfile 定制镜像

以nginx 镜像为例,这次我们使用 Dockerfile 来定制

  • 首先使用 docker pull 拉取NGINX镜像
  • 在一个空白目录中,建立一个文本文件,并命名为 Dockerfile

注意请在/usr/local操作

mkdir /usr/local/docker
cd /usr/local/docker
mkdir mynginx
cd mynginx
touch Dockerfile

其内容为:

FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
[[email protected] mynginx]# vim dockerfile
FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

注意/usr/share/nginx/html/index.html为镜像容器的路径

[email protected]:/# cat /usr/share/nginx/html/index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

4.4.2 构建镜像

指令 docker build . 格式如下

 docker build [选项] <上下文路径/URL/->

示例


[[email protected] mynginx]# docker build -t mynginx .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM nginx
 ---> 27a188018e18
Step 2/2 : RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
 ---> Running in 9a276bb8afb2
Removing intermediate container 9a276bb8afb2
 ---> 6f394ce1d302
Successfully built 6f394ce1d302
Successfully tagged mynginx:latest

4.4.3 Dockerfile指令详解

4.4.3.1COPY 复制文件

格式:

  • COPY <源路径>... <目标路径>
  • COPY ["<源路径1>",... "<目标路径>"]

和 RUN 指令一样,也有两种格式,一种类似于命令行,一种类似于函数调用。

COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

COPY package.json /usr/src/app/

4.4.3.2 ADD 更高级的复制文件

ADD 指令和 COPY 的格式和性质基本一致,但是在 COPY 基础上增加了一些功能

4.4.3.3 CMD 容器启动命令

CMD 指令的格式和 RUN 相似,也是两种格式

  • shell 格式:CMD <命令>
  • exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
  • 参数列表格式:CMD ["参数1", "参数2"...]。在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。

在指令格式上,一般推荐使用 exec 格式,这类格式在解析时会被解析为 JSON 数组,因此一定要使用双引号 ",而不要使用单引号。

4.4.3.4 ENTRYPOINT 入口点

ENTRYPOINT 的格式和 RUN 指令格式一样,分为 exec 格式和 shell 格式。

ENTRYPOINT 的目的和 CMD 一样,都是在指定容器启动程序及参数。

ENTRYPOINT 在运行时也可以替代,不过比 CMD 要略显繁琐,需要通过docker run 的参数 --entrypoint 来指定。

4.4.3.5 ENV 设置环境变量

格式有两种

  • ENV <key> <value>
  • ENV <key1>=<value1> <key2>=<value2>...

4.4.3.6 ARG 构建参数

格式:ARG <参数名>[=<默认值>]
构建参数和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。但是不要因此就使用 ARG 保存密码之类的信息,因为 docker history 还是可以看到所有值的。

4.4.3.7 VOLUME 定义匿名卷

格式为:

  • VOLUME ["<路径1>", "<路径2>"...]
  • VOLUME <路径>

4.4.3.8 EXPOSE 暴露端口

格式为 EXPOSE <端口1> [<端口2>...]

4.4.3.9 WORKDIR 指定工作目录

格式为 WORKDIR <工作目录路径>

4.4.3.10 USER 指定当前用户

格式:USER <用户名>

4.4.3.11 HEALTHCHECK 健康检查

格式

  • HEALTHCHECK [选项] CMD <命令> 设置检查容器健康状况的命令
  • HEALTHCHECK NONE 如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

    HEALTHCHECK 指令是告诉 Docker 应该如何进行判断容器的状态是否正常

4.4.3.12 ONBUILD 为他人作嫁衣

格式: ONBUILD <其它指令>

4.4.4 参考文档

5 操作 Docker 容器

容器是 Docker 又一核心概念。

简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。

本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。

Docker 启动容器

启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(stopped)的容器重新启动。

因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器

新建并启动

所需要的命令主要为 docker run

$ docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world

启动已终止容器

可以利用 docker container start 命令,直接将一个已经终止的容器启动运行。

Docker 守护态运行

更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现

$ docker run -d ubuntu:17.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

此时容器会在后台运行并不会把输出的结果 (STDOUT) 打印到宿主机上面(输出结果可以用 docker logs 查看)。

使用 -d 参数启动后会返回一个唯一的 id,也可以通过 docker container ls 命令来查看容器信息

$ docker container ls
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
77b2dc01fe0f  ubuntu:17.10  /bin/sh -c 'while tr  2 minutes ago  Up 1 minute        agitated_wright

要获取容器的输出信息,可以通过 docker container logs 命令

$ docker container logs [container ID or NAMES]
hello world
hello world
hello world
. . .

Docker 终止容器

可以使用 docker container stop 来终止一个运行中的容器。

Docker 进入容器

在使用 -d 参数时,容器启动后会进入后台。

某些时候需要进入容器进行操作,包括使用 docker attach 命令或 docker exec 命令,推荐大家使用 docker exec 命令,原因会在下面说明。

attach 命令

docker attach 是 Docker 自带的命令。下面示例如何使用该命令

$ docker run -dit ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia

$ docker attach 243c
[email protected]:/#

exec 命令

-i -t 参数

docker exec 后边可以跟多个参数,这里主要说明 -i -t 参数
只用 -i 参数时,由于没有分配伪终端

Docker 导出和导入容器

导出容器

如果要导出本地某个容器,可以使用 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 import http://example.com/exampleimage.tgz example/imagerepo

Docker 删除容器

可以使用 docker container rm 来删除一个处于终止状态的容器。例如

$ docker container rm  trusting_newton
trusting_newton

如果要删除一个运行中的容器,可以添加 -f 参数

清理所有处于终止状态的容器

docker container ls -a 命令可以查看所有已经创建的包括终止状态的容器

清除docker container prune

访问 Docker 仓库

Docker 数据管理

这一章介绍如何在 Docker 内部以及容器之间管理数据,在容器中管理数据主要有两种方式:

  • 数据卷(Volumes)
  • 挂载主机目录 (Bind mounts)

Docker 数据卷

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性

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

选择 -v 还是 -–mount 参数

Docker 新用户应该选择 --mount 参数,经验丰富的 Docker 使用者对 -v 或者 --volume 已经很熟悉了,但是推荐使用 --mount 参数。

创建一个数据卷

$ docker volume create my-vol

查看所有的 数据卷

$ docker volume ls

local               my-vol

在主机里使用以下命令可以查看指定 数据卷 的信息

$ docker volume inspect my-vol
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]

创建mysql

docker run -p 3306:3306 --name mysql 
-v /usr/local/docker/mysql/conf:/etc/mysql 
-v /usr/local/docker/mysql/logs:/var/log/mysql 
-v /usr/local/docker/mysql/data:/var/lib/mysql 
-v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files 
-e MYSQL_ROOT_PASSWORD=Admin123 
-d mysql

在mysql8中多了/var/lib/mysql-files
在docker启动会报错需要添加
-v /usr/local/docker/mysql/mysql-files:/var/lib/mysql-files \

Docker Compose

什么是 Docker Compose

Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用

Docker Compose 简介

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,跟 OpenStack 中的 Heat 十分类似。

Docker Compose 安装与卸载

Compose 支持 Linux、macOS、Windows 10 三大平台。

Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。

前两种方式是传统方式,适合本地环境下安装使用;最后一种方式则不破坏系统环境,更适合云计算场景。

Docker for Mac 、Docker for Windows 自带 docker-compose 二进制文件,安装 Docker 之后可以直接使用。

docker-compose --version

docker-compose version 1.17.1, build 6d101fb

二进制包

在 Linux 上的也安装十分简单,从 官方 GitHub Release 处直接下载编译好的二进制文件即可。

例如,在 Linux 64 位系统上直接下载对应的二进制包。

curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

如果报权限问题请执行

chmod +x /usr/local/bin/docker-compose

卸载

如果是二进制包方式安装的,删除二进制文件即可

sudo rm /usr/local/bin/docker-compose

Docker Compose 使用

术语

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

docker-compose.yml

编写 docker-compose.yml 文件,这个是 Compose 使用的主模板文件。

[[email protected] tomcat]# vim docker-compose.yml

version: '3'
services:
  tomcat:
    restart: always
    image: tomcat
    container_name: tomcat
    ports:
     -  8080:8080

运行 compose 项目

docker-compose up 此时访问本地 5000 端口,每次刷新页面,计数就会加 1。

[[email protected] myshopp]# vim docker-compose.yml
version: '3'
services:
  web:
    restart: always
    image: tomcat
    container_name: web
    ports:
     - 8080:8080
    volumes:
     - /usr/local/docker/myshopp/ROOT:/usr/local/tomcat/webapps/ROOT
  mysql:
    restart: always
    image: mysql
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      TZ: Asia/changsha
      MYSQL_ROOT_PASSOWRD: Admin123
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
    volumes:
      - mysql-data:/var/lib/mysql
volumes:
  mysql-data: