Docker 学习系列二之基本管理

时间:2022-05-06
本文章向大家介绍Docker 学习系列二之基本管理,主要内容包括概述、Docker容器管理、Docker容器进阶管理、Docker镜像管理、Dockerfile编译、定制基础镜像、Docker仓库管理、Docker私有仓库、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

概述

之前对docker的基本的工作原理进行了简单的介绍和学习Docker工作原理 今天开始不断的学习Docker的容器、镜像和仓库管理

Docker容器管理

Docker 常用管理操作

test@dev:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
26ed33c0a572        wordpress           "docker-entrypoint.sh"   47 hours ago        Exited (0) 47 hours ago                       mywordpress
083ddb3cbaf0        mariadb             "docker-entrypoint.sh"   47 hours ago        Exited (0) 47 hours ago                       db

container ID默认128位,但是一般前16位即可保证其在本机的唯一性。image代表了镜像。command在创建容器时执行的命令,status该容器的状态信息。

  • 创建容器# docker run 参数 docker run --name db --env MYSQL_ROOT_PASSWORD=123 -d mysql

参数详解:

  • —name:容器的名字。
  • —env:传入容器的环境变量。
  • -d:该容器启动的mysql服务设置为后台服务。
  • 打开/关闭容器 docker stop/start CONTAINER_ID/NAME
  • 删除容器 docker rm name #强制删除正在运行的数据 docker rm -f name
  • 查询容器信息 docker inspect NAMES #通过-f指定提取指定信息 docker inspect -f {{.State.Status}} name
  • 容器日志信息记录 docker logs name #-f 指定实时日志 docker logs -f name
  • 容器资源占用查询 docker stats
  • 执行容器内部命令 # docker exec + 容器名 + 命令 docker exec name ping baidu.com #通过参数-it登入容器可执行多条命令 docker exec -it name /bin/bash ....... ....... #执行完成之后退出容器,键入exit即可。 exit 例如: test@dev:~$ docker exec db ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 1 1.4 1.7 959520 134844 ? Ssl 14:24 0:00 mysqld root 60 0.0 0.0 17500 2096 ? Rs 14:25 0:00 ps aux test@dev:~$ docker exec -it db /bin/bash root@083ddb3cbaf0:/# exit exit

Docker容器进阶管理

Docker是基于进程的轻量级虚拟化,基本上一个容器一个进程,如果一个系统由于多个进程组成,那么需要管理多容器构成的系统。 比如一个系统由两个容器构成,分为容器A和容器B,启动时先启动容器A再启动容器B。实现这种多容器管理,Docker提供了常用的两种方式。

  1. —link指定关联容器,即使指定了关联容器,必须确保需要的容器先启动。该命令只是说明当前容器启动时需要关联的容器先启动。 1.1 Docker link docker run --name pwordpress --link db ......
  2. Docker Compose,是docker提供的容器之间的编排工具。 2.1 Docker Compose 创建 在项目文件夹下创建一个docker-compose.yml文件,内容如下:
pwordpress:
	image: wordpress
	links:
		- db:mysql
	ports:
		_ 8090:80
db:
	image: mysql
	environment:
		MYSQL_ROOT_PASSWORD=123

links,ports,environment分别表示了docker客户端下的—link,-p,-env参数。 创建完成之后,最后在该目录下启动即可。

docker-compose up
#如果你的编排文件在别处,可以通过-f参数指定编排文件,-d代表后台服务。
docker-compose -f /opt/test.yml up -d

2.2 Docker Compose 启动和关闭

docker-compose -f /opt/test.yml start/stop

2.3 Docker Compose 项目删除

docker-compose -f /opt/test.yml down

2.4 Docker Compose 查询状态信息

docker-compose -f /opt/test.yml ps

Docker镜像管理

Docker的镜像采用分层机制,这样既可以节省空间又不会破坏多层配置文件。Docker的镜像通过联合文件系统将各层文件叠加到一起,作为终端用户可以看成是一个完整的文件系统。对于Docker的镜像已有的分层只能读不能修改,并且上层优先级高于下一层。Docker采用分层进制,但是如果一味的增加层数会越来越笨重容量越来越大,所以大多数应用采用Dockerfile来管理镜像。

  • 删除镜像docker rmi name

Dockerfile创建

在了解Dockerfile之前先来了解一下它的语法,一个redis镜像的dockerfile语法如下:

FROM test/ubuntu:16.04
MAINTAINER test@hotmail.com
ENV REDIS_USER=redis 
    REDIS_DATA_DIR=/var/lib/redis 
    REDIS_LOG_DIR=/var/log/redis
RUN apt-get update && apt-get install -y redis-server 
    && rm -rf /var/lib/apt/lists/*
COPY entrypoint.sh /sbin/entrypoint.sh
RUN chmod 755 /sbin/entrypoint.sh
EXPOSE 6479/tcp
VOLUME ["${REDIS_DATA_DIR}"]
ENTRYPOINT ["/sbin/entrypoint.sh"]
  • 可以连接多行命令。
  • FROM:镜像是从最底层基础镜像开始搭建,表明基础镜像来源。
  • MAINTAINER:表明基础镜像的拥有者。
  • ENV:需要设置的环境变量。
  • RUN:需要运行的shell命令,可通过&&连接多条命令。
  • COPY:将本地的文件copy镜像中。
  • EXPOSE:指定监听的端口。
  • VOLUME:镜像卷的存储路径。
  • ENTRYPOINT:以上关键字都是在构建镜像时运行的,ENTRYPOINT创建镜像时不执行,使用该镜像创建容器时且容器启动后才执行该命令。

该redis镜像它是从基础镜像test/ubuntu:16.04开始构建的(最底层),然后按照RUN关键字需要安装的命令运行相应的shell命令。最后通过ENTRYPOINT指定使用该redis镜像创建容器后需要运行的命令。 创建一个redis的镜像文件,然后在创建redis/Dockerfile文件,将上述开头内容放入Dockerfile中,然后再去创建一个redis/entrypoint.sh文件。里面的逻辑内容即为你创建容器后所需要做的操作。

Dockerfile编译

dockerfile已经创建完成了,我们需要编译我们编写的dockerfile文件。我们通过docker build命令来编译,比如:

docker build -t test_redis:v1.0
#-t选项给镜像起一个名字。
#等待执行完毕,执行完毕之后可以查看我们本地的镜像文件。
docker images -a

值得关注的是在我们构建自己的镜像时,尽量采用相同底层的基础镜像。

定制基础镜像

我们在自己构建dockerfile时都是通过别人基础镜像基础上构建自己底层镜像。那么能不能构建我们自己私有基础镜像呢?答案是肯定可以。我们可以通过debootstrap工具就可以构建自己的基础镜像。

#制作一个ubuntu14.04的基础镜像,并设置时区为东八区。
sudo apt-get install debootstrap
sudo debootstrap --arch amd64 trusty ubuntu-trusty http://mirrors.163.com/ubuntu
cd ubuntu-trusty
sudo cp usr/share/zoneinfo/Asia/Shanghai etc/localtime
#提交生成基础镜像,名字可以自定制(ubuntu1404-baseimage)
cd ubuntu-trusty
sudo tar -c .|docker import - ubuntu1404-baseimage:1.0
#查看我们生成的基础镜像
docker images -a

这些所有的镜像都是在本机中,如何将自己生成的镜像文件供别人使用。那就需要将镜像上传到仓库中。

Docker仓库管理

Docker仓库分为共有仓库和私有仓库,公有仓库大多数是开源的供互联网下载和使用,私有仓库是公司内部自己搭建的仓库,供公司使用。Docker官方公有仓库是Docker Hub

Docker公有仓库

首先注册一个Docker Hub的账户,然后登陆操作。比如:

docker login
Username: brian
Password:
#登陆成功后显示相应的个人信息

1.上传镜像

docker push ubuntu14.04-baseimage

2.搜索镜像

docker search name

3.下载镜像

docker pull name

Docker私有仓库

Docker的私有仓库通过docker-registry来构建。我们来构建我们公司内部的私有仓库,如下: 1.安装docker-registry

#1.可以通过Docker Hub提供的镜像来安装。
docker run -p 5000:5000 registry
#2.通过第三方安装包来安装,默认监听的也是5000端口。
sudo yum install docker-registry
sudo systemctl docker-registry start

2.增加相应的配置文件 在docker-registry启动时会根据配置文件的信息来启动和加载,所以配置文件很重要,默认的配置文件一般在/etc/docker-registry.yml.相应的配置文件参考官方的sample.yml,可以设置自己的生产、开发和测试环境的registry。 3.构建安全的registry 默认的docker-registry是不支持ssl了,所以我们需要加上一些认证功能。如下:

sudo yum install nginx 
#创建registry的配置文件。
sudo touch /etc/nginx/conf.d/registry.conf
sudo nano /etc/nginx/conf.d/registry.conf
#内容如下
upstream docker-registry{
  #docker-registr公布的地址和端口
  server localhost:5000;
}
server{
  listen 443;
  server_name dev.registry.com;
  ssl on;
  #public certificate
  ssl_certificate /etc/ssl/certs/docker-registry.crt;
  #private key
  ssl_certificate_key /etc/ssl/private/docker-registry.key;
  client_max_body 0;
  chunked_transfer_encoding on;
  location / {
    auth_basic   "Restricted";
    #用户和密码文件
    auth_basic_user_file docker-registry.htpasswd;
    include docker-registry.conf;
  }
  location /_ping{
    auth_basic off;
    include docker-registry.conf;
  }
  location /v1/_ping{
  	 auth_basic off;
  	 include docker-registry.conf;
  }
 
}
#保存上述文件,然后创建/etc/nginx/docker-registry.conf文件
sudo touch /etc/nginx/docker-registry.conf
sudo nano  /etc/nginx/docker-registry.conf
proxy_pass   http://docker-registry;
proxy_set_header Host   $http_host;
proxy_set_header X-Real-IP   $remote_addr;
proxy_set_header Authorization   "";
proxy_read_timeout  900;
#保存以上文件,重启nginx。然后再去创建认证的用户和密码
htpasswd -bc /etc/nginx/docker-registry.htpasswd USERNAME PASSWORD
#所有的配置文件配置完成下面我们需要配置认证中心。

4.配置ssl并生成公钥和私有key

#创建CA
echo 01 >ca.srl
#创建一个rsa并且基于des3的
openssl genrsa -des3 -out ca-key.pem 2048
openssl req -new -x509 -days 365 -key ca-key.pem -out ca.pem
#为nginx创建证书
openssl genrsa -des3 -out server-key.pem 2048
openssl req -subj 'CN=dev.registry.com' -new -key server-key.pem -out server.csr
openssl x509 -req -days 365 -in server.csr -CA ca.pem -CAkey ca-key.pem -out server-cert.pem
#删除server key中的passphrase
openssl rsa -in server-key.pem -out server-key.pem
#z最后安装
cp server-cert.pem /etc/ssl/certs/docker-registry.pem
cp server-key.pem /etc/ssl/private/docker-registry.key
#重启nginx
systemctl nginx restart

5.客户端配置

#安装CA(centos)
update-ca-trust enable
cp ca.pem /etc/pki/ca-trust/source/anchors/ca.crt
update-ca-trust extract
#登录nginx
docker login -u USERNAME -p PASSWORD -e brian_lv@163.com https://dev.registry.com
#如果登录成功,会显示Login succedded,并且在$home目录下,生成一个.dockercfg文件保存认证信息。
#上传镜像
docker tag last dev.registry.com/brian_lv/httpd
docker push dev.registry.com/brian_lv/httpd

这种认证一是麻烦而是粗糙且配置容易出错,官方正在配置和改进。 参考书籍 1.《Docker入门》 2.《循序渐进学Docker》 3.《Docker技术入门与实战》