docker是以一个开源的虚拟化部署工具,能够让人从繁杂的项目部署及管理中解脱出来
之前公司全部用的手动后台启动,包括内部服务和所用的组件(mysql,redis等),环境多了之后难以管理,出现了而很多痛点。后来决定采用docker改变现状。
需要的工具
- docker
- docker-compose,进行多容器应用的部署和管理,用起来会更方便
安装docker及docker-compose
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo curl -L 'https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64' -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
执行sudo docker run hello-world成功说明docker安装成功
执行docker-compose version成功说明docker-compose安装成功
遇到问题可尝试重启网络服务:service network restart
docker默认安装路径:/var/lib/docker 注:镜像和容器也在这里
docker-compose安装路径:/usr/local/bin/docker-compose
镜像容器存储路径配置
如上所说docker镜像和容器的默认存储位置为/var/lib/docker
,但可能会产生磁盘占满的情况,从而导致很多错误,比如:
E138: Can’t write viminfo file /root/.viminfo!
[35381] INTERNAL ERROR: cannot create temporary directory!
为避免这种异常情况发生,可以选择修改docker镜像和容器的存储位置,以/home/docker/lib为例
1. 停止docker服务 systemctl stop docker
2. mkdir -p /home/docker/lib
3. 如果之前已经有数据在/var/lib/docker,则mv /var/lib/docker/* /home/docker/lib/,否则不用此操作
4. 修改docker配置 vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --graph /home/docker/lib
5. 重新enable 一下docker 服务 重新进行软连接 以及进行一次 daemon-reload
systemctl disable docker
systemctl enable docker
systemctl daemon-reload
systemctl start docker
6. 查看docker info信息
centos卸载docker
yum list installed|grep docker
yum -y remove docker.x86_64 docker-client.x86_64 docker-common.x86_64
rm -rf /var/lib/docker #删除已存在的镜像和容器(以实际情况docker配置路径而定)
卸载docker-compose
sudo rm /usr/local/bin/docker-compose #删除二进制文件即可
实施过程
- 搭建私有企业级docker仓库
作为企业内部docker服务,考虑到安全性和传输速度可靠性,需要搭建私有的docker仓库,用来存储企业内部的镜像文件。
目前市场上有两种docker仓库供选择:docker registry 和docker harbor
docker registry是docker官方提供,docker harbor是vmware开源,提供ui界面
相比较而言,docker registry更加轻量,部署更加方便。
docker官方示例:(启动docker registry通过docker原生启动)
这里提供一个docker-compose方式启动的yml
version: "3"
services:
registry:
image: registry:2
restart: always
environment:
REGISTRY_AUTH: htpasswd
REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
volumes:
- /etc/localtime:/ect/localtime:ro
- /var/lib/registry:/var/lib/registry
- /var/lib/registry/auth:/auth
expose:
- 5000
ports:
- '5000:5000'
以测试环境为示例,生产环境使用添加证书等参见官方文档
配置密码
docker run --entrypoint htpasswd registry:2.7.0 -Bbn testuser testpassword > /var/lib/registry/auth/htpasswd
重新启动服务:docker-compose up -d
配置密码后无法直接通过curl -XGET 127.0.0.1:5000/v2/_catalog在服务器上查看仓库中有哪些镜像
但可通过浏览器访问登录查看
查看镜像版本列表:curl -XGET 127.0.0.1:5000/v2/image_name/tags/list
- 将服务打成镜像
dockerfile示例:
FROM ubuntu:16.04
MAINTAINER xxx "xxx@qq.com"
# add project source code
RUN mkdir /code
ADD ./hqhttp /code #hqhttp是运行的二进制文件
WORKDIR /code
EXPOSE 8821
ENTRYPOINT ["./hqhttp"]
makefile示例:
version ?= test
date_str=`date +%Y-%m-%d\ %H:%M:%S`
code_ver=`git log --oneline -n1 | cut -f1 -d ' '`
.PHONY: all clean push
all:
go build
sudo docker build . -t hqht-hqhttp:$(version)
clean:
-sudo docker rmi hqht-hqhttp:$(version)
push:
sudo docker push hqht-hqhttp:$(version)
外部访问
首先需要配置私有registry地址
vim /etc/docker/daemon.json
{
"insecure-registries": [
"hub.docker.jiankunking.io:5000"
]
}
//多个私服写法,逗号分隔即可
{
"insecure-registries": [
"test.docker.jiankunking.io:5000",
"hub.docker.jiankunking.io:5000" #优先级从前到后
]
}
此处不考虑证书配置
如果私有registry设置密码,则需要先登录
docker login ip:port
参考资料:
docker官方文档 包含registry
ontainer_linux.go:349: starting container process caused "exec: “htpasswd”: executable file not fo