乐趣区

关于docker:Docker-入门实践

Docker 介绍

参考:为什么须要 Docker?

Docker 是一个开源的利用容器引擎,基于 Go 语言并听从 Apache2.0 协定开源。

次要利用场景如下:

  1. 环境隔离

    容器间环境互相独立,互不影响。相似于虚拟机,但相比于更轻量。Docker 各个容器共享一个操作系统内核,而每一个虚拟机都有一套残缺的操作系统。

  2. 整体部署

    能够将一整套环境构建为镜像,进行整体部署,防止线上线下开发环境带来的各种问题,同时也极大地提高了部署效率,不再须要反复配置开发环境。

Docker 架构

Docker 的三个重要概念:

  1. 镜像(Image)

    相当于一个操作系统模板,比方官网镜像 mysql 就蕴含了一套残缺的操作系统。

  2. 容器(Container)

    容器是镜像运行的实体,好比于 Java 中对象是类的实例。容器能够被创立、启动、暂停和进行等。

  3. 仓库(Repository)

    保留镜像的仓库,好比于 Maven 仓库用来保留依赖的 Jar 包。

Docker 应用客户端 - 服务器 (C/S) 架构模式,应用近程 API 来治理和创立 Docker 容器。

  1. Docker_Client

    通过命令行与 Docker daemon(守护过程)通信。

  2. Docker_Host

    用于执行 Docker daemon 的主机。

  3. Registry

    Docker 仓库,一个 Registry 能够蕴含多个 Repository 仓库。

Docker 装置

CentOS

卸载旧版本(如果存在)

yum remove docker docker-common docker-selinux docker-engine

装置依赖软件包

yum install -y yum-utils device-mapper-persistent-data lvm2

设置 yum 源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

装置 Docker

yum install -y docker-ce docker-ce-cli containerd.io

可能因为版本起因提醒 requires containerd.io >= 1.2.2-3,先手动装置新版 containerd.io:

wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
yum -y install containerd.io-1.2.6-3.3.el7.x86_64.rpm

而后从新执行 Docker 装置命令即可。

启动并退出开机启动

systemctl start docker && systemctl enable docker

验证

docker version

镜像减速

运行 bash 命令;

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io

而后重启 docker 服务;

systemctl daemon-reload && systemctl restart docker

近程拜访

批改 docker 服务脚本:

vi /lib/systemd/system/docker.service

ExecStart=/usr/bin/dockerd这一行的前面增加:

 -H tcp://0.0.0.0:2375

而后重启 docker 服务:

systemctl daemon-reload && systemctl restart docker

验证操作后果:

curl http://localhost:2375/version

近程拜访(TLS)

上述凋谢近程拜访存在极大的安全隐患,没有认证受权,可采纳 TLS 认证欠缺;

# 创立 Docker TLS 证书
#!/bin/bash

#相干配置信息
SERVER="106.13.180.17"
PASSWORD="123456"
COUNTRY="CN"
STATE="湖北省"
CITY="武汉市"
ORGANIZATION="公司名称"
ORGANIZATIONAL_UNIT="Dev"
EMAIL="13437104137@qq.com"

### 开始生成文件 ###
echo "开始生成文件"

#切换到生产密钥的目录
cd /etc/docker   
#生成 ca 私钥(应用 aes256 加密)
openssl genrsa -aes256 -passout pass:$PASSWORD  -out ca-key.pem 2048
#生成 ca 证书,填写配置信息
openssl req -new -x509 -passin "pass:$PASSWORD" -days 3650 -key ca-key.pem -sha256 -out ca.pem -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER/emailAddress=$EMAIL"

echo "subjectAltName = IP:$SERVER" >> extfile.cnf
echo "extendedKeyUsage = serverAuth" >> extfile.cnf
#生成 server 证书私钥文件
openssl genrsa -out server-key.pem 2048
#生成 server 证书申请文件
openssl req -subj "/CN=$SERVER" -new -key server-key.pem -out server.csr
#应用 CA 证书及 CA 密钥以及下面的 server 证书申请文件进行签发,生成 server 自签证书
openssl x509 -req -days 3650 -in server.csr -CA ca.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out server-cert.pem -extfile extfile.cnf

#生成 client 证书 RSA 私钥文件
openssl genrsa -out key.pem 2048
#生成 client 证书申请文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr

echo "extendedKeyUsage=clientAuth" > extfile.cnf
#生成 client 自签证书(依据下面的 client 私钥文件、client 证书申请文件生成)openssl x509 -req -days 3650 -in client.csr -CA ca.pem -CAkey ca-key.pem  -passin "pass:$PASSWORD" -CAcreateserial -out cert.pem -extfile extfile.cnf

#更改密钥权限
chmod 0400 ca-key.pem key.pem server-key.pem
#更改密钥权限
chmod 0444 ca.pem server-cert.pem cert.pem
#删除无用文件
rm client.csr server.csr

echo "生成文件实现"
### 生成完结 ###

同时批改 docker 服务脚本:

vi /lib/systemd/system/docker.service

批改 ExecStart=/usr/bin/dockerd 这一行为:

ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock \
         --tlsverify \
         --tlscacert=/etc/docker/ca.pem \
         --tlscert=/etc/docker/server-cert.pem \
         --tlskey=/etc/docker/server-key.pem \
         -H tcp://0.0.0.0:2376

重启 docker;

systemctl daemon-reload && systemctl restart docker

连贯验证;

docker --tlsverify --tlscacert=/etc/docker/ca.pem   --tlscert=/etc/docker/cert.pem --tlskey=/etc/docker/key.pem -H tcp://106.13.180.17:2376 version

留神服务 IP 填写本人对应的主机 IP。

Hello World

docker run hello-world

运行 hello-world 镜像,先在本地主机查找,不存在则从镜像仓库中拉取。

[root@localhost ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:9572f7cdcee8591948c2963463447a53466950b3fc15a247fcad1917ca215a2f
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/

常用命令

参考:Docker 命令大全

docker run ubuntu:15.10 /bin/echo "Hello world"

运行一个 ubuntu 容器,版本号为 15.10,并执行 /bin/echo “hello world”。

docker exec -it centos /bin/bash

进入一个 name 为 centos 的容器,并且跳转到该容器 bash 终端。

可选项

  1. -i

    交互式操作,通常和 -t 组合应用;

  2. -t

    在新容器内指定一个伪终端;

  3. -d

    后盾运行;

  4. -e

    设置环境变量;

  5. -p

    端口映射,主机端口: 容器端口

容器

  1. ps

    获取容器列表;

  2. run

    指定镜像运行一个容器;

  3. start/stop/restart

    启动、进行或重启一个容器;

  4. rm

    删除容器;

  5. exec

    在容器内执行命令;

  6. logs

    获取容器内的日志;

镜像

  1. images

    获取本地镜像列表;

  2. rmi

    删除本地镜像;

局部 \<none\>:\<none\> 的镜像没有任何援用,能够通过 docker rmi $(docker images -f “dangling=true” -q) 革除。

实际

工夫同步

通常宿主机和 docker 容器机器工夫不统一,可采取内部挂载解决;

-v /etc/localtime:/etc/localtime:ro

MySQL 装置

装置

创立一个 mysql 容器,映射本机端口 3306 至容器,并初始化明码为 123456;

docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql

数据长久化

每次从新创立 mysql 容器相干数据会被初始化,能够通过 -v 指定挂载门路;

docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /docker/mysql/data:/var/lib/mysql mysql

增加近程用户

进入 mysql 容器 bash 终端交互;

docker exec -it mysql /bin/bash

连贯 mysql 服务;

mysql -uroot -p123456

执行上面 SQL;

create user 'caojiantao'@'%' identified with mysql_native_password by '123456';
grant all privileges on *.* to 'caojiantao'@'%' with grant option;
flush privileges;

SpringBoot 部署(Idea)

Docker 连贯

如果 docker 近程连贯采纳 TLS 连贯,那么首先将服务器的 ca.pemcert.pemkey.pem三个文件下载到本地 D:\docker 目录,而后如图设置 docker 连贯;

Dockerfile

新建 Dockerfile 文件,用来构建镜像,放在我的项目的根目录;

FROM java:8
ADD "/target/docker-0.0.1-SNAPSHOT.jar" "app.jar"
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

镜像部署

减少镜像部署配置,留神最底部 Maven 命令,clean package -DskipTests,用来生成构建镜像须要的 jar 包;

内部挂载

通常须要挂载“我的项目配置”、“动态资源”和“服务日志”几个目录,通过 idea 也能很不便的操作,通过上图中的 Bind mounts 设置;

退出移动版