docker介绍
- 什么是容器
- linux vserver
- chroot,namespaces 命名空间,通过Cgroups控制每个namespace中的资源分配
- 通过比较复杂的代码开发过程,调用以上三项技术,实现容器的创建—-管理—-销毁
- 通过比较复杂的代码开发过程,调用以上三项技术,实现容器的创建—-管理—-销毁
- linux vserver
容器的今生
- 实现隔离能力
- LXC(linux container)
- 对于原有的常用功能进行了封装,方便我们做容器的生命周期管理
- 对于原有的常用功能进行了封装,方便我们做容器的生命周期管理
- —-> Docker(dotcloud)
- 社区版ce,企业版ee
- 社区版ce,企业版ee
- 去中心化
Docker容器实质上是宿主机上的进程。Docker通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时复制实现了高效的文件操作。 linux内核实现namespace的一个主要目的,就是实现轻量级虚拟化服务。在同一个namespace下的进程可以感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,仿佛置身于一个独立的系统环境中,以达到独立和隔离的目的。
- 实现隔离能力
-
docker的安装
yum源准备
curl http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
安装依赖包
yum -y install yum-utils device-mapper-persistent-data lvm2
yum list docker-ce.x86_64 --showduplicates | sort -r
安装docker-ce
yum -y install --setopt=obsoletes=0 \docker-ce-17.03.2.ce-1.e17.centos.x86_64 \docker-ce-selinu-xxxx.centos.noarch
- 上面是安装指定版本的包,需写上完整的包名
- 当然可以直接安装最新版本的包,无需加上包名,
yum -y install docker-ce
- 启动docker服务
systemctl daemon-reload
systemctl restart docker
docker version
docker info
配置镜像加速
镜像都保存在这里,https://hub.docker.com/
阿里云Docker-hub
https://cr.console.aliyun.com/cn-hangzhou/mirrors
mkdir -p /etc/docker
tee /etc/docker/daemon.json << -'EOF'
{
"registry-mirrors":["https://uoggbppok.mirror.aliyuncs.com"]
}
EOF #意思就是向json文件中添加上面三行的内容
########################################################
这个东西是可以去阿里云获取的,
首先登录 https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,会获取专属的镜像地址
systemctl daemon-reload
systemctl restart docker
-
docker的镜像基础管理
获取镜像
docker search centos
docker pull centos:6.9
docker pull centos:7.5.1804
docker pull nginx
- 镜像基本查看
docker image ls
- 标识镜像唯一性的方法:
- REPOSITORY:TAG centos:7.5.1804
- IMAGE ID(sha256:64的号码,默认只截取12位) 82f3b5f3c58
- 查看更详细的信息,
docker image ls --no-trunc
- REPOSITORY:TAG centos:7.5.1804
- 镜像详细信息查看
docker image inspect ubuntu:latest
docker image inspect 82f3b5f3c58
- 只查看镜像ID,
docker image ls -q
- 镜像的导入和导出
docker image save nginx > /opt/nginx.tar.gz
然后分发给别人,更方便进行镜像分发docker image rm 82f3b5f3c58
docker image load -i /opt/nginx.tar.gz
docker image tag 82f3b5f3c58 nginx:latest
给添加个标签- 每添加一个标签,查看image就会新增一行,但是IMAGE_ID都是一样的
- 全部删除了,docker image rm -f
docker image ls -q
这样,后面的命令用反引号弄起来
容器的管理
运行第一个容器:
- 交互式容器
docker image ls
获取image的唯一标识docker container run -it 82f3b5f3c58
交互式;并且每登录一个窗口就会有一个tty(新的终端)cat /etc/redhat-release
查看下容器的版本- 后面加上,/bin/bash 因为有的image提供商,在你启动时并不会调用/bin/bash
docker container ls -a
查看容器状态- container_id:容器的唯一号码(自动生成的)
- names:容器的名字(可以自动,也可以手动指定)
- status:容器的
- container_id:容器的唯一号码(自动生成的)
docker container run -it --name="xiaobai_centos" 82f3b5f3c58
- 退出去后,再次进入交互式容器,
docker exec -it 82f3b5f3c58 bash
docker attach 82f3b5f3c58
- 退出去后,再次进入交互式容器,
- 删除容器,
docker rm -f 82f3b5f3c58
-f 强制,kill也可,docker --help
- ^AA^
- 守护式容器
docker run -d --name="xiaobai_nginx" nginx:1.14
若本地没有,就自动先从registory上pull下来docker container ls -a
docker container inspect xiaobai_nginx
,查询容器的详细信息curl -I 172.17.0.3
检查下是否可用
- 容器的应用场景
- 交互式:
- 在启动时,
docker container run -it --name="xiaobai_centos" --rm 82f3b5f3c58
- 当容器退出时,就自动删除,不用手动删了,需要stop
- 一般用作工具类的:开发、测试、临时性任务
- 在启动时,
- 守护式:服务
docker run -d -p 8080:80 --name="xiaobai_nginx_80" nginx:1.14
容器内80端口映射到宿主机8080,实现容器对外提供服务了
- 容器的启动/关闭/连接
- 启动一个容器,交互式,启动完了直接登进去,
container start -i 82f3b5f3c58
interactive- stop 关闭
- 不加 -i,
就是后台启动了,适用于守护式容器的启动和关闭
docker container attach xiaobai_centos6.9
连接到一个容器docker container exec -it xiaobai_centos6.9 /bin/bash
以子进程的方式登录,- 在已有工作容器中生成子进程,可以进行容器的调试,退出时也不会影响到当前容器
- 容器的后台及前台运行:
- ctrl+P,Q 会退出到宿主机,而容器内的终端还是在的(实现了交互式会话一直不断)
- 会提示,
[root@30eaf8262d6b /]# read escape sequence
- attach重新连接回容器,
docker container attach testcc
- 会提示,
- 让程序前台一直运行(夯在前台),类似tail -f(可见下图)
- 在制作守护式容器时,常用的方法
- 还可以写上死循环
- ssh -D(夯在前台)
docker container run -d -it --name="xiaobai_test" 2199b8eb8390
- 同样可以删除所有的容器,docker container rm -f
docker container ls -aq
后面是反引号
容器的网络访问
docker run -d --name="xiaobai_n1" nginx:1.14
docker run -d --name="xiaobai_n2" nginx:1.14
docker container exec -it xiaobai_n1 /bin/bash
docker container exec -it xiaobai_n2 /bin/bash
或是启动两个centos容器,方便测试两个容器间能否通信
- 指定映射(docker会自动添加一条iptables规则来实现端口映射)
- -p hostPort:containerPort
- -p ip:hostPort:containerPort
docker container run -d -p 10.0.0.100:8081:80 --name="n2" nginx:1.14
- -p ip::containerPort(随机端口32768-60999)
docker container run -d -p 172.16.1.200::80 --name="n3" nginx:1.14
- -p hostPort:containerPort/udp
- -p 81:80 -p 443:443 将多个端口映射出来,适用于多服务
- -p hostPort:containerPort
随机映射
docker container ls -a -q
显示出来所有容器的ID- 也就是
docker ps -a -q -l
老的
- 也就是
docker container top 82f3b5f3c58
一般,一个docker就跑一个应用服务docker container logs 82f3b5f3c58
,不登录,查看日志,-f 参数,-tf 参数更详细docker run -d --name="n1" -p 80:80 nginx
docker image ls
docker container exec -it n1 /bin/bash
登录到容器
- 手工交互数据:
docker container cp index.html n1:/usr/share/nginx/html/
,将网站文件拷贝进去,了解docker container cp --help
- volume实现宿主机和容器的数据共享
docker run -d --name="n2" -p 81:80 -v /opt/html:/usr/share/nginx/html nginx
docker container exec -it n2 /bin/bash
在宿主机改动,在容器的对应目录上会同步改动- 作用:实现数据持久化
- -v /opt/volume/a:/opt/a -v /opt/volume/b:/opt/b 实现多个数据卷
- 使用数据卷容器:
touch /opt/volume/a/a.txt
touch /opt/volume/b/b.txt
拷贝数据到数据卷中,宿主机模拟数据目录- 启动数据卷容器
docker run -it --name="centos_volumes" -v /opt/volue/a:/opt/a -v /opt/volume/b:/opt/b centos:6.9 /bin/bash
- CTRL+p q 只一次就可
- 使用数据卷容器,进行挂载到容器。适用于集群化的时候
docker run -d -p 8085:80 --volumes-from nginx_volumes --name "http8085" nginx
docker run -d -p 8086:80 --volumes-from nginx_volumes --name "http8086" nginx
docker container exec -it http8085 /bin/bash
检查目录文件
作用:在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,可以采用数据卷容器进行统一管理
搭建本地yum仓库,并定期同步阿里云源,参考
- 安装vsftpd,
yum -y install vsftpd
systemctl enable vsftpd
systemctl start vsftpd
- 上传系统镜像到虚拟机,
mount -o loop /mnt/CentOS-6.9xxxx.iso /var/ftp/centos6.9
- windows验证:ftp://10.0.0.100/centos6.9/
mount -o loop /mnt/CentOS-7.5xxxx.iso /var/ftp/centos7.5
- 配置yum仓库文件
- 启动基础镜像
docker run -it --name="xiaobai_centos" 82f3b5f3c58
mv *.repo /tmp
然后,按上面步骤,配置yum仓库文件- 生产时,应该把aliyun的软件包同步过来,在本地准备好
- 生产时,应该把aliyun的软件包同步过来,在本地准备好
- 安装所需要的软件包
yum makecache fast && yum -y install openssh-server
- 然后可以从宿主机ssh到容器内,但是一旦从连接上的容器退出,也就ssh不上去了
docker container top xiaobai_centos
inspect查看容器的详细信息IP等容器内运行,/etc/init.d/sshd start
/etc/init.d/sshd stop
- 然后可以从宿主机ssh到容器内,但是一旦从连接上的容器退出,也就ssh不上去了
- 镜像的制作
docker commit xiaobai_centos xiaobai/centos6.9_sshd:v1
,基于容器去制作镜像(静态资源)docker image ls
- 基于新镜像启动容器
docker container run -d --name=sshd 7c0ddaff04aa /usr/sbin/sshd -D
- 如果指定启动时执行的第一条命令是 /etc/init.d/sshd start,那查看容器状态是 exited,因为执行完第一条指令就退出了。
- /usr/sbin/sshd -D ,sshd服务前台运行,相当于一直夯那儿
- 也就是说,云服务提供商提供给用户的云服务器后,用户无需去登录到服务器启动服务,即可以实现ssh连接,一个道理
- 如果指定启动时执行的第一条命令是 /etc/init.d/sshd start,那查看容器状态是 exited,因为执行完第一条指令就退出了。
构建企业网站定制镜像(Centos6.9_SSHD_LAMP_BBS)
- 启动基础镜像
docker image ls
mkdir -p /opt/vol/mysql /opt/vol/html
,宿主机创建目录docker container run -it --name="xiaobai_centos_bbs" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html centos:6.9
- 测试一下数据卷可用性
- 测试一下数据卷可用性
- 优化yum源,安装所需要的软件
mv /etc/yum.repos.d/*.repo /tmp
echo -e "[ftp]\nname=ftp\nbaseurl=ftp://172.17.0.1/centos6.9\nenabled=1\ngpgcheck=0" > /etc/yum.repos.d/ftp.repo
yum makecache fast && yum -y install openssh-server httpd mysql mysql-server php php-mysql
- 软件的初始化
etc/init.d/sshd start
etc/init.d/sshd stop
echo "123456" | passwd root --stdin
/etc/init.d/mysqld start
,检查下宿主机数据卷下是否同步过去了grant all on *.* to root@'%' identified by '123';
grant all on *.* to discuz@'%' identified by '123';
create database discuz charset utf8;
/etc/init.d/httpd start
/etc/init.d/httpd restart
- 注意退出来的操作,ctrl+p q
- 制作LAMP第一版镜像
docker container ls -a
docker commit c3fd597ec194 xiaobai/centos_lamp:v1
- 根据第一版镜像,启动新容器,
docker container run -it --name="xiaobai_centos_bbs_v3" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html -p 8080:80 xiaobai/centos_lamp:v1
- 测试php功能,
echo "<?php\nphpinfo();\n?>" >/var/www/html/index.php
- 安装bbs论坛,
- 将下载下来的bbs包上传到宿主机网站目录内,解压,然后浏览器访问
- 能够按照步骤正常安装就可以了
- 将下载下来的bbs包上传到宿主机网站目录内,解压,然后浏览器访问
- 制作LAMP+bbs第二版镜像
docker container ls -a
docker commit xiaobai_centos_bbs_v3 xiaobai/centos6.9_sshd_lamp_bbs:v1
- 创建启动脚本,(能且只能启动一个主进程,并且夯住,类似linux启动时先是init,然后同样调用脚本)
vim /opt/vol/html/init.sh 宿主机创建就可
#!/bin/bash
/etc/init.d/mysqld start
/etc/init.d/httpd start
/usr/sbin/sshd -D
chmod 777 init.sh
- 启动容器,映射端口,挂载数据卷,自动启多服务
docker limage ls -a
docker container run -d --name="xiaobaiyun_lamp_bbs" -v /opt/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html -p 22222:22 -p 8888:80 -p 33060:3306 xiaobai/centos6.9_sshd_lamp_bbs:v1 /var/www/html/init.sh
- 脚本路径写容器里的路径
- 如果上面脚本写错了没关系,docker container rm -f
docker ps -a -q
,删除重复上一条
- 脚本路径写容器里的路径
centos:7.5.1804_sshd
- 启动基础容器
- ~~
docker run -it --name=c75sshd centos:7.5.1804
~~ docker run --privileged -it --name=c75sshd -v /sys/fs/cgroup:/sys/fs/cgroup centos:7.5.1804 /usr/sbin/init
- 手动执行sshd的启动
mkdir -p /var/run/sshd
echo 'UseDNS no' >> /etc/ssh/sshd_config
sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd
echo 'root:123456' | chpasswd
/usr/bin/ssh-keygen -A
docker commit xiaobai_c75sshd c75sshd
- 制作镜像,
docker commit c75sshd xiaobai_c75sshd
docker image ls -a
- 启动镜像,
docker container run --rm -d --name=sshd_2222 -p 222:22 xiaobai_c75sshd /usr/sbin/sshd -D
- 如果按照上图的来,就是
docker container run -d --name=sshd_2222 -p 222:22 xiaobai/centos7:v1 /usr/sbin/sshd -D
- 注意!!
- 如果涉及到
systemctl start zabbix-agent
或者systemctl restart network
这种的,就需要权限 docker run -itd --privileged=true --name=zabbix_agent02 agent /usr/sbin/init
- 注意一定是 /usr/sbin/init 运行
参考,三个重要权限,operation not permitted
通过dockerfile定制企业镜像
在下一篇…