微服务中的容器技术---Docker(一),Docker的安装和使用

Docker

概述

在微服系统中,因为服务特别多,如果手动部署以及启动、重启等工作会比较繁琐,这里会涉及到自动化部署,自动化部署就需要用到容器技术,虽然这里基本属于运维范畴,但是开发者还是需要了解一下,以及简单操作使用需要会。
现在比较热门的容器技术当然还是Docker了。关于容器和Docker的名词解释请百度/Google/Bing一下,解释比较详细,这里不过多描述。

Docker生命周期

Docker生命周期

Docker安装

  1. 安装环境如下:
[root@localhost etc]# cat redhat-release
CentOS Linux release 7.6.1810 (Core) 

[root@localhost etc]# uname -r
3.10.0-957.10.1.el7.x86_64

#节点1
[root@localhost etc]# hostname -I
192.168.0.241 

#节点2
[root@localhost ~]# hostname -I
192.168.0.242 
  1. 开始安装,一次输入以下指令
> wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

> sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo

> yum install docker-ce -y

#可以安装前查看仓库中的docker所有版本,并选择特定版本安装,如17.12.0
#选择版本的时候需要注意不要过高,需匹配containerd.io的版本
#出现containerd.io版本错误,可以降低docker版本或者更新containerd.io版本
> yum list docker-ce --showduplicates | sort -r
> yum install docker-ce-17.12.0.ce

显示下图,安装完毕


docker 安装完毕
  1. 开始配置
#修改配置
> vim /usr/lib/systemd/system/docker.service
#找到ExecStart,开启远程API访问端口:-H 192.168.0.241:2375
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H 192.168.0.241:2375

#修改完,保存并重启docker服务
> systemctl daemon-reload &&  systemctl enable docker.service && systemctl restart docker

查看网桥信息

> docker network inspect bridge

默认的为:172.17.0.0/16,也可以修改上述配置文件docker.service中的ExecStart参数,添加自定义ip段,如:--bip 10.0.0.1/16,这里不作修改保持默认。


image.png
  1. 访问192.168.0.241验证一下配置是否正确
> docker -H 192.168.0.241 info
  1. 显示信息如下:
docker 验证

Docker基础命令操作

  • 查看docker相关信息:docker version
> docker version  

显示如下

docker
  • 配置docker中国镜像加速
    有时候默认的镜像源比较卡会超时,出现类似以下的错误

docker: error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/ae/ae2feff98a0cc5095d97c6c283dcd33090770c76d63877caa99aefbbe4343bdd/data?verify=1608604222-lIzhXR%2Fys89hEl3C9yzHrbN6mSQ%3D: net/http: TLS handshake timeout.

可以更新一下源的配置来加速

> vi /etc/docker/daemon.json
#加入以下内容
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}  
#当然,也可以使用其他源在后边加逗号添加地址即可
#比如阿里云镜像https://xxx.mirror.aliyuncs.com,这里的xxx为系统分配前缀 。

修改完记得重载、重启

systemctl daemon-reload && systemctl restart docker
  • 启动第一个容器
> docker run -d -p 80:80 nginx
# 没有的话会从源上 拉取一个镜像

如下图所示

nginx image

※这里出现一个错误,因为服务器中之前安装过lnmp,所以启动docker中的nginx的时候,提示80端口被占用了,这里需要关闭原来的nginx

> lnmp nginx stop

访问http://192.168.0.241,显示如下


nginx

参数说明如下:

parameter introduction
  • 搜索仓库中的镜像
#如搜索redis 镜像
> docker search redis
#显示结果如下:
image.png

参数说明


parameter introduction
  • 获取镜像
> docker pull redis

#如果镜像是第三方镜像,则需要加具体第三方地址
> docker pull index.tenxcloud.com/tenxcloud/httpd
  • 获取完之后可以查看镜像
[root@localhost docker]# docker image list
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    ae2feff98a0c   6 days ago    133MB
redis        latest    ef47f3b6dc11   10 days ago   104MB
  • 导出镜像
[root@localhost docker]# docker image save redis > docker-redis.tar.gz
[root@localhost docker]# ls
daemon.json  docker-redis.tar.gz  key.json
  • 删除镜像
[root@localhost docker]# docker image rm redis:latest

#查询镜像列表
[root@localhost docker]# docker image list
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
nginx        latest    ae2feff98a0c   6 days ago   133MB
  • 导入镜像
[root@localhost docker]# docker image load -i docker-redis.tar.gz

#查询镜像列表
[root@localhost docker]# docker image list
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    ae2feff98a0c   6 days ago    133MB
redis        latest    ef47f3b6dc11   10 days ago   104MB
  • 查看镜像的详细信息
[root@localhost docker]# docker image inspect redis

容器的日常管理

  • 启动容器
[root@localhost docker]# docker run nginx
  • 查看正在运行的容器
[root@localhost docker]# docker container ls
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                NAMES
6620631e4975   nginx     "/docker-entrypoint.…"   35 minutes ago   Up 35 minutes   0.0.0.0:80->80/tcp   affectionate_rhodes
  • 快速启动容器
[root@localhost docker]# docker run  mysql:latest  /usr/bin/sleep 20;
  • 启动redis 并配置端口以及账号密码
[root@localhost docker]# docker run -d --name root -p 6379:6379 redis --requirepass "123123"
a528bbba31ab60cabdda0f4398ef4cf4bebb4d6996819c26b5280add744881e1
  • 查看你容器详细信息
[root@localhost docker]# docker container inspect 6620631e4975  
#6620631e4975   为redis容器的id,可以在查看正在运行的容器的结果里看到
  • 查看你所有容器(包括未运行的)
[root@localhost docker]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS                        PORTS                    NAMES
76d59fca157f   mysql          "docker-entrypoint.s…"   4 minutes ago       Exited (127) 4 minutes ago                             agitated_lamport
61c9ecd03a3d   mysql:latest   "docker-entrypoint.s…"   5 minutes ago       Exited (127) 5 minutes ago                             festive_golick
a528bbba31ab   redis          "docker-entrypoint.s…"   10 minutes ago      Up 10 minutes                 0.0.0.0:6379->6379/tcp   root
226447f2093e   redis          "docker-entrypoint.s…"   15 minutes ago      Exited (0) 10 minutes ago                              musing_wu
604f18efaf3c   redis:latest   "docker-entrypoint.s…"   15 minutes ago      Exited (127) 15 minutes ago                            priceless_pare
94aac2583416   nginx          "/docker-entrypoint.…"   20 minutes ago      Exited (0) 19 minutes ago                              inspiring_mahavira
6620631e4975   nginx          "/docker-entrypoint.…"   53 minutes ago      Up 53 minutes                 0.0.0.0:80->80/tcp       affectionate_rhodes
7b9a34037aba   nginx          "/docker-entrypoint.…"   About an hour ago   Created                                                elated_lederberg
  • 停止容器
[root@localhost docker]# docker stop 7b9a34037aba
#或
[root@localhost docker]# docker container  kill 76d59fca157f

  • 删除所有容器
[root@localhost docker]# docker rm -f  `docker ps -a -q`
  • 启动时进行端口映射
[root@localhost docker]# docker run -d -p 80:80 nginx:latest
af85d7e1670dbb7e391cd19733c521af41824ba7c70a5f51af9a8f967bb78e06

不同指定映射方法

参数说明
  • 进入容器
> docker run -it nginx:latest 
> docker attach 1bf0f43c4d2f

#exec 进入容器方法(推荐使用)
> docker exec -it 1bf0f43c4d2f /bin/bash 

Docker 数据卷的管理

  • 挂在卷
[root@localhost docker]# docker run -d -p 80:80 -v /data:/usr/share/nginx/html nginx:latest
6a7cea392577e0c14b1eb21117bdc8eb7c2b6cbf921c7f472dc180e823d03431

容器内站点目录: /usr/share/nginx/html,可以测试一下

#写入数据到/data/index.html,并访问
[root@localhost html]# echo "http://www.docker-test.com" > /data/index.html
[root@localhost html]# curl 192.168.0.241
http://www.docker-test.com
  • 设置共享卷,使用同一个卷启动一个新的容器
[root@localhost docker]# docker run -d -p 8080:80 -v /data:/usr/share/nginx/html nginx:latest
8a24e6e2e314ae99ba37cb5a5e29093cf7d721d600662872642abbc0c0b04680

测试一下

[root@localhost html]# curl 192.168.0.241:8080
http://www.docker-test.com
  • 查看卷列表
[root@localhost docker]# docker volume ls
DRIVER    VOLUME NAME
local     98634ca089006f43966f067067b49f27c94c591cd0de971ba776257cef3492ff
local     d18512ab022fabe00b682906efdefc759ae93bf288664279ecfd8e7f12e2d11b
local     d116492c60ce15ce9df3f796990e72a302e4b048b91179b7370ebbc17592e653
local     e5b5e0e325411d38b5b953819c9a52d725762b8fd07030cc41839c18355d55c3
local     e9ce7babf62514608dc98f7656c65bb10d59804beb59ddcf8fdd32a5064abd33
  • 创建一个卷
[root@localhost docker]# docker volume create
85cfd88f320a1f83318cdfdd53916ac124e31acba97242536b9406097adf27f9
查看卷列表
  • 查看卷路径
[root@localhost docker]# docker volume inspect 85cfd88f320a1f83318cdfdd53916ac124e31acba97242536b9406097adf27f9
查看卷路径
  • 使用新创建的卷 挂载数据
[root@localhost docker]# docker volume create zxlab
zxlab
[root@localhost docker]# docker volume ls
DRIVER    VOLUME NAME
local     85cfd88f320a1f83318cdfdd53916ac124e31acba97242536b9406097adf27f9
local     98634ca089006f43966f067067b49f27c94c591cd0de971ba776257cef3492ff
local     d18512ab022fabe00b682906efdefc759ae93bf288664279ecfd8e7f12e2d11b
local     d116492c60ce15ce9df3f796990e72a302e4b048b91179b7370ebbc17592e653
local     e5b5e0e325411d38b5b953819c9a52d725762b8fd07030cc41839c18355d55c3
local     e9ce7babf62514608dc98f7656c65bb10d59804beb59ddcf8fdd32a5064abd33
local     zxlab
[root@localhost docker]# docker run -d -p 9000:80 -v zxlab:/usr/share/nginx/html nginx:latest 
d7cfc4c6b480e6714ad20a06fe3ff8948e35c253b755752f309e4278d2f38f72
[root@localhost docker]# echo 'test.docker.cc' >/var/lib/docker/volumes/zxlab/_data/index.html 
[root@localhost docker]# curl 192.168.0.241:9000
test.docker.cc
  • 查看使用的端口
[root@localhost docker]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 192.168.0.241:2375      0.0.0.0:*               LISTEN      16200/dockerd       
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      3004/sshd                
tcp6       0      0 :::9000                 :::*                    LISTEN      19344/docker-proxy           
tcp6       0      0 :::8080                 :::*                    LISTEN      19085/docker-proxy  
tcp6       0      0 :::80                   :::*                    LISTEN      18896/docker-proxy  

手动将容器保存为镜像

官方镜像列表:
https://hub.docker.com/explore/

  • 启动一个centos6.8的镜像
> docker pull  centos:7.6

#启动并进入容器
> docker run -it -p 1022:22 centos:7.6  /bin/bash

# 在容器种安装sshd服务,并修改系统密码
> yum install  openssh-server -y 
> echo "root:123456" |chpasswd
> /etc/init.d/sshd start

启动完成后镜像ssh连接测试

  • 将容器提交为镜像
# 容器名称 镜像名称
> docker commit brave_mcclintock  centos7-ssh

#使用新的镜像启动容器
> docker run -d  -p 1122:22  centos7-ssh:latest  /usr/sbin/sshd -D 

#进入容器后,在容器安装httpd服务
> yum install httpd -y
#编写启动脚本脚本 init.sh,内容如下
[root@5b8161fda2a9 /]# cat  init.sh 
#!/bin/bash 
/etc/init.d/httpd start 
/usr/sbin/sshd -D
> chmod +x init.sh 
#退出容器,重新提交
[root@localhost docker]# docker commit  5b8161fda2a9 centos7-httpd 
#启动容器,并测试
[root@localhost docker]# docker run -d -p 1222:22 -p 80:80  centos6-httpd /init.sh 
46fa6a06644e31701dc019fb3a8c3b6ef008d4c2c10d46662a97664f838d8c2c

Dockerfile自动构建docker镜像

可以参考官方的dockerfile文件:https://github.com/CentOS/CentOS-Dockerfiles

以下为nginx的dockerfile

# "ported" by Adam Miller  from
#   https://github.com/fedora-cloud/Fedora-Dockerfiles
#
# Originally written for Fedora-Dockerfiles by
#   scollier 
#
# Enriched by patterns found at https://github.com/openshift/postgresql/blob/master/9.4/Dockerfile.rhel7 by
#   Christoph Görn 

FROM centos:centos7
MAINTAINER The CentOS Project 

# Labels consumed by Red Hat build service
LABEL Component="nginx" \
      Name="centos/nginx-180-centos7" \
      Version="1.8.0" \
      Release="1"

# Labels could be consumed by OpenShift
LABEL io.k8s.description="nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev." \
      io.k8s.display-name="nginx 1.8.0" \
      io.openshift.expose-services="80:http" \
      io.openshift.tags="nginx"

RUN yum -y install --setopt=tsflags=nodocs centos-release-scl-rh && \
    yum -y update --setopt=tsflags=nodocs && \
    yum -y install --setopt=tsflags=nodocs scl-utils rh-nginx18 && \
    yum clean all && \
    mkdir -p /usr/share/nginx/html

# Get prefix path and path to scripts rather than hard-code them in scripts
ENV CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/nginx \
ENABLED_COLLECTIONS=rh-nginx18

# When bash is started non-interactively, to run a shell script, for example it
# looks for this variable and source the content of this file. This will enable
# the SCL for all scripts without need to do 'scl enable'.
ENV BASH_ENV=${CONTAINER_SCRIPTS_PATH}/scl_enable \
    ENV=${CONTAINER_SCRIPTS_PATH}/scl_enable \
    PROMPT_COMMAND=". ${CONTAINER_SCRIPTS_PATH}/scl_enable"

ADD root /

# ADD https://git.centos.org/sources/httpd/c7/acf5cccf4afaecf3afeb18c50ae59fd5c6504910 /usr/share/nginx/html/
# RUN sed -i -e 's/Apache/nginx/g' -e '/apache_pb.gif/d' /usr/share/nginx/html/index.html
RUN echo "nginx on CentOS7" > /usr/share/nginx/html/index.html

EXPOSE 80

USER nginx

ENTRYPOINT ["container-entrypoint"]
CMD [ "nginx18" ]

dockerfile主要组成部分:

  • 基础镜像信息 FROM centos:centos7
  • 制作镜像操作指令RUN yum -y install --setopt=tsflags=nodocs centos-release-scl-rh
  • 容器启动时执行指令 CMD [ "nginx18" ]

dockerfile常用指令:

  • FROM : 指定基础镜像
  • MAINTAINER 告诉别人,谁负责养它?(指定维护者信息,可以没有)
  • RUN : 操作,比如安装、更新、创建文件夹等,在命令前面加上RUN即可
  • ADD : 给它设置权限,比如COPY文件,会自动解压
  • WORKDIR : 设置当前工作目录
  • VOLUME : 设置卷,挂载主机目录
  • EXPOSE : 指定对外的端口
  • CMD : 指定容器启动后的要干的事情
  • COPY : 复制文件
  • ENV : 环境变量
  • ENTRYPOINT : 容器启动后执行的命令

如何创建一个Dockerfile?

#进入一个创建好的目录
> cd /opt/base
#编写Dockerfile
[root@localhost base]# vim Dockerfile
[root@localhost base]# cat Dockerfile
FROM centos:centos7
RUN yum install openssh-server -y
RUN echo "root:123123" |chpasswd
RUN /etc/init.d/sshd start
CMD ["/usr/sbin/sshd","-D"]

#使用编写好的Dockerfile ,构建docker镜像, -t 给镜像打标签, . 为当前目录
[root@localhost base]# docker image build -t centos7-ssh .

#完成后查看镜像列表
[root@localhost base]# docker image list
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
           ae20c8b4f2ad   2 minutes ago   300MB
mysql        latest    a347a5928046   10 hours ago    545MB
nginx        latest    ae2feff98a0c   6 days ago      133MB
redis        latest    ef47f3b6dc11   10 days ago     104MB
centos       centos7   8652b9f0cb4c   5 weeks ago     204MB
#更多的Dockerfile可以参考官方方法。

总结

好了,以上是Docker入门的一些日常操作,后续还有Docker容器操作的拓展内容。

你可能感兴趣的:(微服务中的容器技术---Docker(一),Docker的安装和使用)