1.容器简介
Docker是一个开源的应用容器引擎,使用Go语言开发,基于Linux内核的cgroup,namespace,Union FS等技术,对应用进程进行封装隔离,并且独立于宿主机与其他进程,这种运行时封装的状态称为容器。
Linux容器是与系统其他部分隔离开的一系列进程,从另一个镜像运行,并由该镜像提供支持进程所需的全部文件。容器提供的镜像包含了应用的所有依赖项,因而在从开发到测试再到生产的整个过程中,它都具有可移植性和一致性。
容器不就是虚拟化吗
是,但也不竟然。
虚拟化使得许多操作系统可同时在单个系统上运行。
容器则可共享同一个操作系统内核,将应用进程与系统其他部分隔离开。
官方文档
https://docs.docker.com/install/linux/docker-ce/centos/
2.安装
2.1卸载旧版本
sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
2.2替换阿里云yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2.3安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2 yum list docker-ce.x86_64 --showduplicates|sort -r #查看版本
2.4安装docker-ce
默认是安装最新稳定版本
yum install -y docker-ce
2.5启动docker服务
systemctl start docker #启动docker stop restart systemctl enable docker #开机启动docker systemctl status docker #查看docker状态
2.6配置阿里云镜像加速
mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://u7vs31xg.mirror.aliyuncs.com"] } EOF systemctl daemon-reload #守护进程重启 systemctl restart docker
2.7卸载
1. systemctl stop docker 2. systemctl diable docker 3. yum remove docker-ce 4. rm -rf /var/lib/docker
3.体系
4.镜像管理
4.1镜像获取
方式一 docker hub 获取 Dockerfile
新建一个文件夹,新建一个文件 Dockerfile
执行docker build 进行构建:
docker build -t centos:v1
使用v1版本的镜像启动一个容器:
docker run -d -p 80:80 centos:v1 -g "daemon off;"
方式二
docker search centos
下载镜像
docker pull centos:7.5 #冒号之后是版本,不加默认选择最新稳定版
查看新构建的镜像:
docker images
有/的是 别人写的 没有/是官方的
4.2标识镜像的唯一性方法
方法1
REPOSITORY:TAG
如,centos:7.5.1804
方法2
IMAGE ID (sha256:64位的号码,默认只取12位)
docker image ls --no-trunc #查看详细信息
4.3镜像详细查看
docker image inspect 镜像名:TAG
docker image inspect ID
4.4查看镜像ID
docker image ls -q
4.5镜像的导入和导出
docker image save ID(镜像名:版本号) >/www/centos.tar #-o docker image rm -f ID docker image load -i /www/centos.tar
改名
docker image tag ID 镜像名:版本号
4.6镜像删除
docker image rm -f ID docker image rm -f `docker image ls -q` #删除所有的
5.容器管理
5.1交互式容器
docker run -it 0f3e07c0138f #-i: 交互式操作。 -t: 终端。
查看正在启动的容器
docker ps # -a 查看所有容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7e2c15223ea8 0f3e07c0138f "/bin/bash" 11 minutes ago Up 11 minutes kind_dijkstra
CONTAINER ID #容器的唯一标识码 NAMES #容器的名字不能重复 可以手动生成 docker run -it --name="zbb" 0f3e07c0138f COMMAND #启动容器运行的命令 STATUS #运行状态
5.2守护式容器
docker run -d --name='zxy' nginx:1.14 #-d 以守护式启动,不手动结束不会停止 #默认 没有镜像 会自动下载 docker container inspect zxy #查看容器详细信息 container默认可以不写
5.3两类容器使用场景
交互式一般用于测试 ,工具,临时任务 用完退出就停止了,但是不会删除,以后会越来越多
docker rm -f kind_dijkstra #删除容器
run -it --name='zbbdentos' --rm 0f3e07c0138f #加rm使用完会自动删除
守护式,如tomcat等软件
docker默认只能内部访问,必须提供端口才能对外访问
docker run -d -p 8080:80 --name='zbb_nginx' nginx:1.14
5.4docker启停
守护式容器
docker stop zxy docker start zxy docker attach zbb #进入容器
交互式
docker stop zxy docker start -i zxy #不加-i连接不进去....只能输入以下命令菜能进入 docker attach zbb
5.5容器的连接
docker attach zbb #进入容器
子进程的方式登录
[root@docker ~]# docker container exec -it zbb /bin/bash exec进入调试 ,这样ctrl + D exit 就不会退出容器 #原理是又开了一个 /bin/bash
容器的后台及前台运行
- ctrl + p ,q
- attach 调用到前台
5.6删除所有容器
docker rm -f `docker ps -a -q`
sudo docker rm $(docker ps -qf status=exited)
5.7容器的网络访问
docker启动的所有容器都是可以内部访问的
docker run -d -p 8080:80 --name='zzb_n1' nginx:1.14 将nginx的80映射到宿主的8080上
映射多个端口
docker run -d -p 8080:80 -p 8888:90 --name='zzb_n2' nginx:1.14
5.8docker管理命令
docker top zzb_n1 #查看进程
UID PID PPID C STIME TTY
root 9923 9907 0 20:27 ? ss nginx -g daemon off;
101 9955 9923 0 20:27 ? ss
docker logs zzb_n1 #-f 持续监控日志 #-t 显示详细时间 #--tail 10 只显示10行
23.112.18.xx - - [04/Nov/2019:12:27:17 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36" "-"
6.数据卷使用
在nginx镜像中无法编辑
在外部创建好文件 cp到对应的目录中 ,手动交互数据
docker cp index.html n1:/usr/share/nginx/html docker cp n1:/usr/share/nginx/html/index.html ./ #但是这样太麻烦了
Volume实现宿主和容器相通
docker run -d --name='n1' -p80:80 -v /html:/usr/share/nginx/html nginx:1.14
作用数据持久化
容器挂载容器 用于批量挂载相同目录的容器,
在集中管理集群中,大批量的容器都需要挂载相同的多个数据卷时,
docker run -d -p 81:80 --volumes-from n1 --name "nn1" nginx:1.14
进入
docker exec -it nn1 /bin/bash #挂载的所有文件同步
7.制造本地局域网yum源
7.1安装
yum install -y vsftpd
7.2启动
systemctl start vsftpd
7.3上传系统镜像
centos7 的镜像上传到服务器
7.4配置
mkdir -p /var/ftp/centos.7.5 mount -o loop /mnt/centos.7.5.iso /var/ftp/centos.7.5
cat >/etc/yum.repos.d/ftp_7.repo <<EOF [ftp] name=ftpbase baseurl=ftp://172.168.2.2/centos7.5 enabled=1 gpgcheck=0 EOF
l浏览器访问,就可以查看
ftp://172.168.2.2/centos7.5
8.镜像制作
获取镜像
docker pull centos:6.9 docker run -it --name='old_centos'
在容器中安装ssh #必须要启动安装密钥对
yum install openssh* /etc/init.d/sshd start
在宿主机上ssh连接测试
ssh 172.17.0.2
8.1基于容器制作镜像
8.11制作阿里云ECS
[root@docker ~]# docker commit old_centos zbb/centos6.9sshd:v1 sha256:4ed573ae9c3b71c2aa61bf44d1cbeabc9e96d92d57c1539fc7eb0e6fd8c42b7b
查看已经制作成功
[root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE zbb/centos6.9sshd v1 4ed573ae9c3b 42 seconds ago 352MB centos v1 0f3e07c0138f 7 weeks ago 220MB nginx 1.14 295c7be07902 7 months ago 109MB centos 6.9 2199b8eb8390 8 months ago 195MB
用这个镜像创建一个容器
[root@docker ~]# docker run -d --name=sshd -p 200:20 4ed573ae9c3b /usr/sbin/sshd -D
连接测试
[root@docker ~]# ssh 172.17.0.2 root@172.17.0.2's password:
8.12构建LAMP环境
启动容器
docker run -it --name='lamp' -v /var/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html centos:6.9
安装lamp
[root@5a110938e7a1 /]# yum install -y openssh* mysql mysql-server httpd php php-mysql
软件初始化
/etc/init.d/sshd start
echo '123' |passwd root --stdin
mysql初始化
/etc/init.d/mysqld start
mysql> grant all on *.* to root@'%' identified by '123';
mysql> create database discuz charset utf8;
apache初始化
[root@5a110938e7a1 mysql]# /etc/init.d/httpd start
根据容器制作镜像
[root@docker ~]# docker commit 5a110938e7a1 zbb/centos_lamp:v1
根据镜像启动容器
docker run -it --name='lamp-cs' -p8888:80 -v /var/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html ad3758bb4262
启动
[root@docker ~]# /etc/init.d/httpd start [root@docker ~]# /etc/init.d/mysqld start
页面访问ip:8888
创建启动脚本
cd /opt/vol/html #映射目录
vim init.sh
#!/bin/bash /etc/init.d/mysqld start /etc/init.d/httpd start /usr/sbin/sshd -D
然后启动容器,运行脚本,就自启动了
docker run -it --name='lamp-cs2' -p8888:80 -v /var/vol/mysql:/var/lib/mysql -v /opt/vol/html:/var/www/html ad3758bb4262 /var/www/html/init.sh
centos7问题
ssh
docker run -it --name=75sshd centos:7.5.1804
yum install -y openssh* mkdir /var/run/ssh echo 'UseDNS no' >> /etc/ssh/sshd_config sed -i -e '/pam_loginuid.so/d' /etc/pam.d/sshd echo 'root:123' |chpasswd /usr/bin/ssh-keygen -A
docker commit old_centos zbb/centos7.5sshd:v1
[root@docker ~]# docker run -d --name=sshd -p 200:20 4ed573ae9c3b /usr/sbin/sshd -D #ssh测试
8.2基于文件创建镜像
#centos-6.9sshd #FROM centos:6.9 FROM 2199b8eb8390 #获取镜像 RUN yum install -y openssh* #执行命令 RUN /etc/init.d/sshd start && /etc/init.d/sshd start && echo '123' |passwd root --stdin EXPOSE 22 #暴露端口 CMD ["/usr/sbin/sshd","-D"] #结束的最后执行的命令
根据镜像创建镜像
docker image build -t 'zbb/centos6.9-sshdv3' ./
创建容器
docker run -d 897a471638e5
查看容器的ip
docker inspect c10335410d7c
连接测试
ssh 172.17.0.2
8.3根据dockerfile 创建LAMP
#centos-lnmp FROM centos:6.9 #FROM 2199b8eb8390 #获取镜像 RUN yum install -y openssh* mysql mysql-server httpd php php-mysql RUN /etc/init.d/sshd start && echo '123' |passwd root --stdin #&& /etc/init.d/mysqld start && /etc/init.d/httpd start #RUN mysql -e "grant all on *.* to root@'%' identified by '123';create database discuz charset utf8;" COPY index.php /var/www/html COPY init.sh / # ADD bbs.tar.gz /var/www/html 会自动解压 还可以传url的文件 EXPOSE 22 EXPOSE 80 EXPOSE 3306 #暴露端口 CMD ["/bin/bash","/init.sh"] #结束的最后执行的命令 #VOLUME ['/var/www/html','/data/mysql/data'] 自动挂载卷 #WORKDIR 进入目录相当于cd #ENV AA_DIR = '/var/www/html' 申明变量 ${AA_DIR}调用 #ENTRYPOINT 和CMD一样 但是不会被命令行的命令 替换掉 #USER 指定用户
vim index.php
<?php phpinfo(); ?>
vim init.sh
#!/bin/bash echo '123' |passwd root --stdin /etc/init.d/mysqld start mysql -e "grant all on *.* to root@'%' identified by '123';create database discuz charset utf8;" /etc/init.d/httpd start /usr/sbin/sshd -D
构建镜像
docker build -t 'zbb/lnmp' ./
制作容器
docker run -d --name='zbb_lnmp' -p33:22 -p34:80 -p3306:3306 zbb/lnmp
测试 浏览器访问端口 服务器telnet 测试端口开放性
9.Docker构建私有registry
搭建docker仓库
1.启动
docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry:/var/lib/registry registry
--restart=always #每次重启doker 容器会自动重启也可以在配置文件中 配置 "live-restore":true
2.修改配置为文件
不改配置文件,默认找的是docker hub
vim /etc/docker/daemon.json
"insecure-registries": ["127.0.0.1:5000"]
3.重启docker
systemctl restart docker
4.上传镜像
docker tag nginx:1.14 127.0.0.1:5000/zbb/nginx:v1 docker push 127.0.0.1:5000/zbb/nginx
5.测试
删除源镜像,从本地上pull
docker image rm -f 295c7be07902 docker pull 127.0.0.1:5000/zbb/nginx:v1
6.本地仓库加安全认证
yum install httpd-tools -y mkdir /opt/registry-auth/ -p htpasswd -Bbn zbb 123 > /opt/registry-auth/htpasswd
重启
docker rm -f `docker ps -aq`
docker run -d -p 5000:5000 -v /opt/registry-auth/:/auth/ -v /opt/registry:/var/lib/registry --name register-auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
上传
docker tag centos:6.9 127.0.0.1:5000/zbb/centos:v1 docker login 127.0.0.1:5000 docker push 127.0.0.1:5000/zbb/centos:v1
10.habor实现图形化register
1.安装
yum install -y docker-compose
2.下载harbor
wget https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.0.tgz
3.上传到/opt下
tar -zxvf harbor-offline-installer-v1.8.0.tgz
4.修改harbor.cfg配置文件
vim harbor.yml
#修改如下几项 hostname = 你本机的IP harbor_admin_password = admin账号的密码
5.编译
./install.sh
ip地址访问 测试
6.加入配置文件
vim /etc/docker/daemon.json
{ "registry-mirrors": ["https://u7vs31xg.mirror.aliyuncs.com"], "insecure-registries": ["127.0.0.1","129.2x.16.25x"], "live-restore": true }
7.重启
systemctl start docker.service
8.新建项目
9.项目推送拉取
docker login 127.0.0.1 docker tag centos:6.9 127.0.0.1/zbb/centos:v2 docker push 127.0.0.1/zbb/centos:v2 docker image rm -f 127.0.0.1/zbb/centos:v2 docker pull 127.0.0.1/zbb/centos:v2
11.Docker网络类型
1.查看支持网络类型
docker network ls
[root@docker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 7e9072c9bb16 bridge bridge local 7921b218278b harbor_harbor bridge local 9643c2e650a2 host host local efabf4ae7459 none null local
2.测试使用各类网络类型
none : 无网络模式
bridge : 默认模式,相当于NAT
host : 公用宿主机Network NameSpace(不隔离网络资源)
container : 与其他容器公用Network Namespace(两个容器共用一个端口)
docker run -it --name="c_h13" --network=host centos:6.9 /bin/bash
3.Docker跨主机网络
4.macvlan
docker自带无需安装 2台服务器
docker network create --driver macvlan --subnet=10.0.0.0/24 --gateway=10.0.0.1 -o parent=eth0 macvlan_1 #docker network rm macvlan_1 删除
#docker run -it --network macvlan_1 --ip=10.0.0.12 busybox #1 docker run -it --network macvlan_1 --ip=10.0.0.13 busybox #2
sudo docker rm $(docker ps -qf status=exited)
5.overlay
容器在两个跨主机进行通信的时候,是使用overlay network这个网络模式进行通信;如果使用host也可以实现跨主机进行通信,直接使用这个物理的ip地址就可以进行通信。overlay它会虚拟出一个网络比如10.0.2.3这个ip地址。在这个overlay网络模式里面,有一个类似于服务网关的地址,然后把这个包转发到物理服务器这个地址,最终通过路由和交换,到达另一个服务器的ip地址。
1.基本配置
两台服务器host1
vim /etc/docker/deamon.json
{ "registry-mirrors": ["https://u7vs31xg.mirror.aliyuncs.com"], "insecure-registries": ["127.0.0.1:5000",], "live-restore": true, "hosts":["tcp://0.0.0.0:2376","unix://var/run/docker.sock"], "cluster-store": "consul://host1_ip:8500", "cluster-advertise": "host1_ip:2376" }
host2
{ "registry-mirrors": ["https://u7vs31xg.mirror.aliyuncs.com"], "insecure-registries": ["127.0.0.1:5000",], "live-restore": true, "hosts":["tcp://0.0.0.0:2376","unix://var/run/docker.sock"], "cluster-store": "consul://host1_ip:8500", "cluster-advertise": "host2_ip:2376" }
会报错,都要改一下配置
vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd
都重启
然后host1安装
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
浏览器输入 ip:8500测试
2.创建overlay网络
host1
docker network create -d overlay zbb
docker run -it --network zbb --name zbb01 busybox:latest /bin/sh
host2
docker network ls #发现也有了 docker run -it --network zbb --name zbb02 busybox:latest /bin/sh / # ping zbb01 #通了
至此完成配置
dcoker network connect zbb zbb05
6.直接路由模式
没做过 网上一位大神写的很好 这是博客地址
https://www.jianshu.com/p/477a62165376
参考文档:docker中文
http://www.dockerinfo.net/document
参考书籍:Docker开发指南
https://www.zhuimengnan.com/docker.pdf