容器理念单进程 鼓励 “一个容器一个进程(one process per container)” 的方式
docker 使用内核级别的资源隔离
Docker和传统的虚拟机方式的不同之处
Docker容器是在操作系统层面上实现虚拟化直接复用本地主机的操作系统因此更加轻量级。
安装Docker
这边使用2-3台测试机 进行安装和测试 可能ip和hostname 会出现不一致 但是步骤和思路是没有问题的,都是走过一遍的
安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
service docker start
启动容器 docker run-name- h hostname 停止容器 docker stop CONTAINER ID 查看容器 docker ps -a -l 进入容器 docker exec docker attach nsenter(推荐) 删除容器 docker rm |
--name 起个名字 -t 分配一个伪终端 -i 让容器的标准输入打开
centos 是镜像 如果本地没有 会在启动时下载 执行一个命令 /bin/bash 或者/bin/bash都可以 进入容器 退出之后 会退出容器 docker run --name bash-test -t -i centos /bin/bash
docker start $CONTAINER ID 进入容器 查看进程 容器理念单进程 |
安装nsenter yum -y install util-linux
docker inspect --format "{{.State.Pid}}" 624b8816e968
nsenter -t 31854 -u -i -n -p进入指定PID的容器
#!/bin/bash PID=$(docker inspect --format "{{.State.Pid}}" $1) nsenter -t $PID -u -i -n -p
有时候会出现进入容器 但是不能联网的情况
只需要退出容器 重新启动一下docker 服务即可 |
#创建私有仓库(官方提供了 registry 镜像来启动本地的私有仓库) docker pull registry
#docker run -d -p 5000:5000 --restart=always registry docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry 注:默认情况下,会将仓库存放于容器内的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器内的/tmp/registry下,如下docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry
导出
在装有docker的新机子上导入 docker load < /tmp/centos.tar.gz
|
只能删除没有创建容器的镜像 |
docer rm $CONTAINER ID 加上-f 即使正在运行的容器也可以删除
docer rm -f $CONTAINER ID
运行结束自动删除容器 运行容器时带上—rm参数
|
随机映射
docker run -P
指定映射
-p host Port: containerPort
-p ip: hostPort: containerPort
-p i: container Port
-p hostPort: container Port: udp
数据卷 -v /data 数据卷容器 --volumes-
-v src:dst from
挂载时指定权限
docker挂载多个目录
docker run --name test -v /tmp/1:/tmp/1 -i -t centos /bin/bash
nginx位于第三方的yum源里面,而不在centos官方yum源里面
这边直接yum 可能会报No package nginx available.
rpm 安装rpm源
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
在执行yum即可
思路:
docker run --name mynginx -it centos容器 ↓ yum -y install nginx ↓ docker run -it --name nginxv1 jiaminxu/mynginx:v1容器↓ ↓ ↓ docker run -d -p 82:80 jiaminxu/mynginx:v2 nginx 容器←
|
docker run --name mynginx -it centos容器
rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx
docker commit -m “名称” $CONTAINER ID 仓库名称/镜像名称/版本
docker commit -m "my nginx" a15eeffbed99 jiaminxu/mynginx:v1
基于镜像启动
docker run -it --name nginxv1 jiaminxu/mynginx:v1
在nginx.conf中添加daemon off;
提交
docker commit -m "my nginx" bf0b50553f26 jiaminxu/mynginx:v2
docker run -d -p 82:80 jiaminxu/mynginx:v2 nginx
nginx 表示启动容器之后运行的命令 查看docker机子的82端口,即映射到容器nginx的80 可以看到nginx 的主页
退出容器之后nginx还是启动着的
docker build /opt/nginx/Dockerfile
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
#This docker file #Version 1 #Author: jiamin xu #Base image FROM centos #Maintainer MAINTAINER jiamin xu [email protected]
#Commands RUN rpm -ivh http://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm RUN yum -y install nginx ADD index.html /usr/share/nginx/html/index.html #不清楚echo 首字母是否需要大写 #RUN echo "daemon off;" >> /etc/nginx/nginx.cnf EXPOSE 80 #CMD ["nginx"] CMD ["nginx", "-g", "daemon off;"] |
上传的文件 需要和 Dockerfile 在一个路径下
构建 -t tag
构建状态会保留
docker build -t jiaminxu/mynginx:v4 /opt/docker/nginx/
docker run -it -d -p 84:80 jiaminxu/mynginx:v4
默认端口5000
docker run -d -p 5000:5000 registry
(docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry)正确启动方式
修改nginx 配置文件nginx.conf
upstream docker-registry {
server 10.6.11.120:5000;
}
server {
listen 443 ssl;
server_name 10.6.11.120 registry.hengtiansoft.com;
ssl_certificate /etc/pki/CA/nginx.crt;
ssl_certificate_key /etc/pki/CA/nginx.key;
proxy_set_header HOST $http_host;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 0;
chunked_transfer_encoding on;
location / {
auth_basic "Docker";
auth_basic_user_file /usr/local/nginx/conf/docker-registry.htpasswd;
proxy_pass http://docker-registry;
}
location /_ping {
auth_basic off;
}
}
生成证书 生产不行
cd /etc/pki/CA
touch ./{serial,index.txt}
#后续第二次签发 需要更换为01 不能重复
echo "00" > serial
openssl genrsa -out private/cakey.pem 2048
openssl req -new -x509 -key private/cakey.pem -days 3650 -out cacert.pem
openssl genrsa -out nginx.key 2048
openssl req -new -key nginx.key -out nginx.csr
签发证书
openssl ca -in nginx.csr -days 3650 -out nginx.crt
让系统接收自签发的证书
#这边用自己的证书也是可以的
cat /etc/pki/CA/cacert.pem >> /etc/pki/tls/certs/ca-bundle.crt
htpasswd -c /usr/local/nginx/conf/docker-registry.htpasswd jiaminxu
提示找不到htpasswd命令
yum -y install httpd
重启nginx
添加/etc/hosts
registry.hengtiansoft.com
登录
Docker version 1.13.1, build dded712/1.13.1 docker login -u jiaminxu -p 123456 -e [email protected] Docker version 18.06.0-ce, build 0ffa825 docker login -u jiaminxu -p 123456 registry.hengtiansoft.com |
docker login -u jiaminxu -p 123456 -e [email protected]
docker login -u jiaminxu -p 123456 registry.hengtiansoft.com
Docker version 18.06.0-ce, build 0ffa825
docker ps -a
查看需要打tag的容器id,先将容器打成镜像
docker commit -m "my nginx" ac000f195cc6 jiaminxu/mynginx:v4
给commit之后的镜像 打一个tag
然后push
docker tag jiaminxu/mynginx:v4 registry.hengtiansoft.com/jiaminxu/mynginx:v5
docker push registry.hengtiansoft.com/jiaminxu/mynginx:v5
如果不成功
尝试以下操作 pull时替换register.hengtiansoft.com 为ip:5000可以pull vim /usr/lib/systemd/system/docker.service systemctl daemon-reload systemctl restart docker docker run -d -p 5000:5000 registry docker login -u jiaminxu -p 123456 registry.hengtiansoft.com docker tag 9380147c5404 registry.hengtiansoft.com/jiaminxu/nginx_test:lastest
|
http://shipyard-project.com/
wget https://wwwfcwys.oss-cn-shenzhen.aliyuncs.com/typecho/2017/12/27/shipyard.tar.gz
tar zxvf shipyard.tar.gz
install.sh //一键安装脚本 deploy //官方安装脚本修改版,若已下载前文所需镜像可直接运行此脚本安装
firewall-cmd --zone=public --permanent --add-port=2375/tcp firewall-cmd –reload
参考https://www.fcwys.cc/index.php/archives/145.html |
启动顺序(重启docker会自动启动shipyard)
docker start shipyard-rethinkdb
docker start shipyard-discovery
docker start shipyard-certs
docker start shipyard-proxy
docker start shipyard-swarm-manager
docker start shipyard-swarm-agent
docker start shipyard-controller
使用
缺陷:添加私有仓库会报错
还是使用老的方式 而不是/v2/_catalog 参考网上2个办法 均不成功 有兴趣的朋友可以尝试一下 https://blog.csdn.net/hailwind/article/details/51526842?locationNum=1 https://www.jianshu.com/p/b0f9739b5c25 构建 shipyard-builder的第5步就会报错 修改源什么的都试了一下 都不行
可能中文版本时间比较久远了 不支持了吧
花了挺多时间 终于找到了可以添加私有仓库的办法 就是将controller换成英文版 即官方版本 首先pull 官方镜像 docker pull shipyard/shipyard 关闭并删除旧容器 避免重启docker 又自动重启容器 docker stop shipyard-controller docker rm shipyard-controller 启动容器 并设置只要容器停止了 就重新启动 附--restart的使用方法 标志 描述 no 不自动重启容器(默认值) on-failure 如果容器由于错误而退出,则将其重新启动,非零退出代码表示错误 unless-stopped 重新启动容器,除非明确停止容器或者 Docker 被停止或重新启动 always 只要容器停止了,就重新启动
docker run --restart always -ti -d --name shipyard-controller-v2 --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 8080:8080 shipyard/shipyard server -d tcp://swarm:3375
启动之后需要等待几分钟 会从中文模式切换到英文模式 直到出现以下界面
添加name=localhost;Registry Address=http://10.6.11.120:5000; Usename和Passwd; 私有仓库地址一定要带上http://否则会报以下错误
添加成功 查看私有仓库地址
手动启动方式(参考) https://www.cnblogs.com/xuezhigu/p/6734756.html 其实只要手动起新controller 其余服务用默认docker start container即可 1. 数据存储(rethinkdb)
docker run -ti -d --name shipyard-rethinkdb rethinkdb 2.服务发现(etcd)
为了启用Swarm leader选择,我们必须使用来自Swarm容器的外部键值存储。此处,我们使用Etcd作为服务发现工具。可以选用的服务发现工具还有Consul、Zookeeper等。
docker run -ti -d -p 4001:4001 -p 7001:7001 --name shipyard-discovery microbox/etcd -name discovery 3. Docker代理服务(shipyard/docker-proxy)
默认情况下,Docker引擎只侦听套接字。 我们可以重新配置引擎以使用TLS,或者您可以使用代理容器。 这是一个非常轻量级的容器,它只是将请求从TCP转发到Docker监听的Unix套接字。
docker run -ti -d -p 2375:2375 --hostname=$HOSTNAME --name shipyard-proxy -v /var/run/docker.sock:/var/run/docker.sock -e PORT=2375 shipyard/docker-proxy 4.Swarm管理节点(swarm manager)
将IP-OF-HOST替换为对应的ip; 将SWARM-INNER-PORT换成对应的端口,默认2375. 将SWARM-MAP-PORT换成映射到host机的ip,例如2376
格式:docker run -ti -d --name -p [SWARM-MAP-PORT]:[SWARM-INNER-PORT] shipyard-swarm-manager docker.io/swarm manage --host tcp://0.0.0.0:[SWARM-INNER-PORT] etcd://[IP-OF-HOST]:4001实例化:docker run -ti -d --name shipyard-swarm-manager swarm manage --host tcp://0.0.0.0:3375 etcd://10.211.55.20:4001 5.Swarm Agent节点将当前docker节点加入到集群中
将IP-OF-HOST替换为对应的ip 将IP-OF-ETCD-HOST换成etcd所在的docker节点ip。 将LOCAL-DOCKER-PORT换成本机docker所监听的端口,例如2375
格式:docker run -ti -d --name shipyard-swarm-agent docker.io/swarm join --addr [IP-OF-HOST]:[LOCAL-DOCKER-PORT] etcd://[IP-OF-ETCD-HOST]:4001
实例: docker run -ti -d --name shipyard-swarm-agent swarm join --addr 10.6.11.120:2375 etcd://discovery:4001 6.启动Shipyard管理工具
docker run -ti -d --name shipyard-controller --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 8080:8080 shipyard/shipyard server -d tcp://swarm:3375 7.浏览器访问:http://10.6.11.120:8080/ 即可进入链接
默认用户名/密码 admin/shipyard 我自己修改成了admin/123456
防火墙需打开4001 2375端口,否则防火墙会拦住容器。 容器界面会显示空白 |
至此 shipyard就可以使用啦.10分感谢文中几个大佬的博客和老男孩的视频.
如果有大佬成功build了支持registry:v2中文的镜像,麻烦分享一下[email protected] 10分感谢