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提供了常用的两种方式。
- —link指定关联容器,即使指定了关联容器,必须确保需要的容器先启动。该命令只是说明当前容器启动时需要关联的容器先启动。 1.1 Docker link docker run --name pwordpress --link db ......
- 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技术入门与实战》
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法