之前对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是基于进程的轻量级虚拟化,基本上一个容器一个进程,如果一个系统由于多个进程组成,那么需要管理多容器构成的系统。
比如一个系统由两个容器构成,分为容器A和容器B,启动时先启动容器A再启动容器B。实现这种多容器管理,Docker提供了常用的两种方式。
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采用分层进制,但是如果一味的增加层数会越来越笨重容量越来越大,所以大多数应用采用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"]
该redis镜像它是从基础镜像test/ubuntu:16.04开始构建的(最底层),然后按照RUN关键字需要安装的命令运行相应的shell命令。最后通过ENTRYPOINT指定使用该redis镜像创建容器后需要运行的命令。
创建一个redis的镜像文件,然后在创建redis/Dockerfile文件,将上述开头内容放入Dockerfile中,然后再去创建一个redis/entrypoint.sh文件。里面的逻辑内容即为你创建容器后所需要做的操作。
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 Hub。
首先注册一个Docker Hub的账户,然后登陆操作。比如:
docker login
Username: brian
Password:
#登陆成功后显示相应的个人信息
1.上传镜像
docker push ubuntu14.04-baseimage
2.搜索镜像
docker search name
3.下载镜像
docker pull name
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技术入门与实战》