[docker入门(一)]https://blog.csdn.net/ck784101777/article/details/102496159
一、自定义镜像
1.何时用到自定义镜像
-利用裸系统(最简化配置),制作自定义系统并保存为镜像
-将当前运行的容器做成镜像,保留改动
-将当前运行的容器转移到其他主机上
2.制作镜像-commit方式
运行容器->查看容器id->执行命令->查看镜像
命令:docker commit 镜像id 新镜像名
- [root@docker1 docker_images]# docker run -it docker.io/centos //运行镜像
- [root@docker1 docker_images]# docker ps //查看容器id
- [root@docker1 docker_images]# docker commit 8d07ecd7e345 docker.io/myos:latest
- sha256:ac3f9c2e8c7e13db183636821783f997890029d687b694f5ce590a473ad82c5f
- [root@docker1 ~]# docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- docker.io/myos latest 87feda116c17 6 weeks ago 321.6 MB
3.制作镜像-Dockerfile方式
Dockerfile是通过脚本的方式制作镜像,不需要手动启动容器.我们需要手写一个名为Dockerfile的文件,并且按照语法格式配置一些参数.然后执行它
Dockerfile语法格式:
– FROM:基础镜像
– MAINTAINER:镜像创建者信息(说明)
– EXPOSE:开放的端口
– ENV:设置环境变量
– ADD:复制文件到镜像
– RUN:制作镜像时执行的命令,可以有多个,多个命令通过&隔开
– WORKDIR:定义容器默认工作目录
– CMD:容器启动时执行的命令,仅可以有一条CMD
通过一个案例来讲解每个参数的用法,下面是制作一个httpd容器的实验
[root@docker1 ~]# mkdir bulid //创建一个目录
[root@docker1 ~]# cd bulid
[root@docker1 bulid]# touch Dockerfile //Dockerfile文件第一个字母要大写
[root@docker1 bulid]# cp /etc/yum.repos.d/local.repo ./ //将yum源拷贝到当前路径下
[root@docker1 bulid]#echo test > index.html //新建一个html页面
[root@docker1 bulid]# vim Dockerfile //编辑Dockerfile
FROM docker.io/myos:latest //基础镜像,这里写参照的镜像名
RUN yum -y install httpd //制作镜像时执行的命令
ENV EnvironmentFile=/etc/sysconfig/httpd //指定执行环境,这是httpd进程执行时参照的环境
WORKDIR /var/www/html/ //定义容器默认工作目录
ADD index.html index.html //将当前路径下的index.html拷贝到镜像里,命名为index.html
EXPOSE 80 //设置开放端口号
CMD ["/usr/sbin/httpd", "-DFOREGROUND"] //启动httpd服务,你可以通过httpd -T找到CMD这一行查看
[root@docker1 bulid]# docker build -t docker.io/myos:http . //别忘了加. 代表当前路径
[root@docker1 bulid]# docker run -d docker.io/myos:http
d9a5402709b26b42cd304c77be442559a5329dc784ec4f6c90e4abac1c88e206
[root@docker1 bulid]# docker inspect d9 //查看容器ip
[root@docker1 bulid]# curl 172.17.0.7 //访问一下,是我们刚才写的文件吧
test
二、创建私有镜像仓库
镜像仓库结构图,我们来看看这个结构图.首先是Images(镜像)和Containers(容器),他们之间的关系是run与commit的关系,镜像通过run变成容器,镜像也可以通过tag(标签)根据原镜像生成一个硬连接.容器通过commit生成镜像,而容器又可以执行stop(停止),start(开始),restart(重启)命令
在看看Dockerfile这个文件,这个文件就是用来构造镜像的,通过build命令生成镜像
然后是backup.tar,镜像通过save生成本地镜像,通过load命令读取本地镜像
Docker registry是镜像仓库,分为私有仓库和公共仓库,仓库是存储镜像的地方,我们公共push上传镜像到仓库,通过pull命令下载镜像
1.自定义一个私有仓库
1)安装仓库
创建私有仓库需要安装 docker-distribution服务
仓库镜像存储地址:/var/lib/registry
仓库配置文件:/etc/docker-distribution/registry/config.yml
- [root@docker1 bulid]# yum install docker-distribution
- [root@docker1 bulid]# systemctl start docker-distribution //启动服务
- [root@docker1 bulid]# systemctl enable docker-distribution
2)配置文件修改
上传镜像需要关闭https验证(仅限私有仓库)和添加一个仓库
- [root@docker1 ~]#vim /etc/hosts //添加一条域名解析
- 192.168.1.31 docker1
- [root@docker1 ~]# vim /etc/sysconfig/docker
- ADD_REGISTRY='--add-registry docker1:5000' //添加一个仓库
- INSECURE_REGISTRY='--insecure-registry docker1:5000' //将这个仓库通过安全授权
- [root@docker1 ~]# systemctl restart docker //重启docker
3)上传本地镜像到仓库
首先要为镜像创建标签,命令:docker tag 新镜像名:新标签名 ip/主机名:5000/镜像:镜像标签
然后是上传命令:docker push ip/主机名:5000/镜像:镜像标签
- [root@docker1 ~]# docker tag docker.io/busybox:latest 192.168.1.31:5000/docker.io/busybox:latest
- //打标签
- [root@docker1 ~]# docker push 192.168.1.31:5000/docker.io/busybox:latest
- //上传
- [root@docker1 ~]# docker tag docker.io/myos:http 192.168.1.31:5000/ docker.io/myos:http
- [root@docker1 ~]# docker push 192.168.1.31:5000/docker.io/myos:http
4)其他主机下载镜像
如果你想下载仓库里的镜像,你也要安装docker-distribution服务,并且修改配置文件
- [root@docker2 ~]# yum install docker-distribution
- [root@docker2 ~]# systemctl start docker-distribution //启动服务
- [root@docker2 ~]# systemctl enable docker-distribution
- [root@docker2 ~]#vim /etc/hosts //添加一条域名解析
- 192.168.1.31 docker1
- [root@docker2 ~]# vim /etc/sysconfig/docker
- ADD_REGISTRY='--add-registry docker1:5000' //添加一个仓库
- INSECURE_REGISTRY='--insecure-registry docker1:5000' //将这个仓库通过安全授权
- [root@docker2 ~]# systemctl restart docker //重启docker
- [root@docker2 ~]#docker pull 192.168.1.31:5000/docker.io/busybox:latest //下载镜像到本地
5)查看镜像仓库
查看私有镜像仓库中的镜像名称:curl http://ip:5000/v2/_catalog
查看某一仓库的标签:cutl http://ip:5000/v2/镜像名/tags/list
仓库镜像存储地址:/var/lib/registry
仓库的ip和主机名都可,主机名必须添加域名解析,如果v2找不到就试一下v1,v3这个我也讲不定
- [root@docker1 bulid]# curl http://docker1:5000/v2/_catalog //查看所有镜像
- {"repositories":["docker.io/busybox","docker.io/myos"]}
- [root@docker1 bulid]# curl http://docker1:5000/v2/docker.io/busybox/tags/list //查看镜像标签
- {"name":"docker.io/busybox","tags":["latest"]}
三、持久化存储(外部存储)-存储卷
1.为什么使用外部存储
docker容器不是保存任何数据的,所以我们将重要的数据保存在外部磁盘上(存储卷),容器可以通过挂载真机的实际目录使用存储数据
2.启动时使用存储卷
命令:docker run -it -v /真机目录:/容器目录 容器名
本命令是将目录挂载到容器中提供持久化存储,目录不存在就自动创建,目录存在就覆盖掉,所以你要确认容器上是否有重名目录
3.实验-将NFS共享文件映射到两个容器中,使用共享资源
实验流程
1.服务器创建NFS共享存储目录,权限为rw
2.客户端挂载共享,将共享目录映射到容器中
3.docker1启动nginx
4.docker2启动apache
5.niginx和apache共享同一web目录
拓扑结构
镜像准备:
1个nginx镜像一个httpd镜像,用docker search 搜索即可
1)配置NFS服务器
- [root@nfs ~]# yum -y install nfs-utils //安装nfs服务
- [root@nfs ~]# mkdir /webroot //创建共享目录
- [root@nfs ~]# vim /etc/exports //编辑nfs配置文件
- /webroot *(rw,no_root_squash) //rw root不降权
- [root@nfs ~]# systemctl restart nfs-server.service
- [root@nfs ~]# systemctl restart nfs-secure.service
- [root@nfs ~]# chmod 777 /content //在其他主机上挂载nfs文件使用的用户是nfs用户没有写权限,将文件修改为777 所有用户有权限写
- [root@nfs ~]# echo hello wrold > /content/index.html //指定一个测试页面
2)docker1主机配置-apache服务
- [root@docker1 bulid]# yum -y install nfs-utils //安装nfs服务
- [root@docker1 bulid]# systemctl restart nfs-server.service
- [root@docker1 bulid]# showmount -e 192.168.1.254 //查看可以挂载的nfs服务
- Export list for 192.168.1.254:
- /webroot *
- [root@docker1 ~]# mkdir /mnt/webroot //创建挂载目录
- [root@docker1 ~]# mount -t nfs 192.168.1.254:/content /mnt/webroot //挂载
- [root@docker1 ~]# ls /mnt/webroot
- index.html
- //启动http容器 -p将端口映射到真机 -v映射真机存储卷
- [root@docker1 ~]# docker run -d -p 80:80 -v /mnt/webroot:/var/www/html -it docker.io/myos:http
- 224248f0df5d795457c43c2a7dad0b7e5ec86abdc3f31d577e72f7929f020e01
- [root@docker1 ~]# curl 192.168.1.31:80 //由于已经将端口映射到真机 直接访问真机80端口即可
- hello wrold
3)docker2主机配置-nginx服务
与上面配置差不多
- [root@docker2 ~]# yum -y install nfs-utils
- [root@docker2 ~]# showmount -e 192.168.1.254
- Export list for 192.168.1.254:
- /webroot *
- [root@docker2 ~]# mkdir /mnt/webroot
- [root@docker2 ~]# mount -t nfs 192.168.1.254:/content /mnt/webroot
- [root@docker2 ~]# docker run -d -p 80:80 -v /mnt/qq:/usr/share/nginx/html -it docker.io/nginx
- 00346dabec2c7a12958da4b7fee6551020249cdcb111ad6a1058352d2838742a
- [root@docker2 ~]# curl 192.168.1.32
- hello wrold
四、自定义网桥
1.为什么要自定义网桥?
-创建容器时默认创建的ip为172.17.0.0/24 这个网段的
-自定义网桥更容易记忆
-为了方便规划网络拓扑
-容器的特征是可以把宿主机变成对应的服务,为了外部网络的主机访问容器内的资源,必须配置网桥
2.如何使将容器端口与宿主端口绑定
使用-p 参数可以将容器端口与宿主端口绑定
命令: docker run -p 宿主机端口:容器端口 -it 镜像名
如将httpd容器变为宿主机httpd服务
docker run itd -p 80:80 docker.ip/httpd
3.实验-自定义网桥
1)查看docker网卡
命令:docker network list
或者 docker network inspect 网卡名
- [root@docker1 ~]# docker network list
- NETWORK ID NAME DRIVER SCOPE
- 996943486faa bridge bridge local
- 63c88dcc3523 host host local
- 5e5ab3d45e27 none null local
2)创建docker网卡
命令:docker network create --subnet=ip 网卡名
- [root@docker1 ~]# docker network create --subnet=10.10.10.0/24 docker1
- b447cacc0373631ff7c534f119047946be5c1498b5b2e31a31180c5ee6320ab5
- [root@docker1 ~]# docker network list
- NETWORK ID NAME DRIVER SCOPE
- 996943486faa bridge bridge local
- 63c88dcc3523 host host local
- 5e5ab3d45e27 none null local
- [root@docker1 ~]# docker network inspect docker1
- [
- {
- "Name": "docker1",
- "Id": "b447cacc0373631ff7c534f119047946be5c1498b5b2e31a31180c5ee6320ab5",
- "Scope": "local",
- "Driver": "bridge",
- "EnableIPv6": false,
- "IPAM": {
- "Driver": "default",
- "Options": {},
- "Config": [
- {
- "Subnet": "10.10.10.0/24"
- } ]
- },
- "Internal": false,
- "Containers": {},
- "Options": {},
- "Labels": {}
- }
- ]
3)使用创建的网卡
命令:docker run --network=网卡名 -itd 镜像名
- [root@docker1 ~]# docker run --network=docker1 -itd docker.io/myos
- 5270cba305c06c3da3f56185b35dc059aabcf2884a12ef717d89a768360e5326
4.修改宿主机网卡名
我们通过docker 命令创建的网卡,通过ifconfig看到的名字默认是br-网卡id ,可读性很差,下面演示如何修改默认网卡名
1)创建一个网卡并查看网卡名
- [root@docker1 ~]# docker network create --driver bridge docker02
- //新建一个 名为docker02的网络模型
- 5496835bd3f53ac220ce3d8be71ce6afc919674711ab3f94e6263b9492c7d2cc
- [root@docker1 ~]# ifconfig
- //但是在用ifconfig命令查看的时候,显示的名字并不是docker02,而是br-5496835bd3f5
- br-5496835bd3f5: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
- inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
- ether 02:42:89:6a:a2:72 txqueuelen 0 (Ethernet)
- RX packets 8 bytes 496 (496.0 B)
- RX errors 0 dropped 0 overruns 0 frame 0
- TX packets 8 bytes 496 (496.0 B)
- TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2)查看inspect对于命名的规定
上面可以通过ifconfig查看到id号,前3位即可,或者通过docker network list 查看
我们再通过inspect查看一下docker网卡底层信息,看到"com.docker.network.bridge.name": "docker0"字样
[root@docker2 ~]# docker network inspect bc5
3)自定义命名创建
命令:docker network create 网卡名 -o com.docker.network.bridge.name=你要修改的网卡名
- [root@docker1 ~]# docker network rm docker02 //删除docker02重新创建
- docker02
- [root@docker1 ~]# docker network create \
- docker02 -o com.docker.network.bridge.name=docker02
- //创建docker02网桥
- 648bd5da03606d5a1a395c098662b5f820b9400c6878e2582a7ce754c8c05a3a
- [root@docker1 ~]# ifconfig //ifconfig查看有docker02
- docker02: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
- inet 172.18.0.1 netmask 255.255.0.0 broadcast 0.0.0.0
- ether 02:42:94:27:a0:43 txqueuelen 0 (Ethernet)
- RX packets 0 bytes 0 (0.0 B)
- RX errors 0 dropped 0 overruns 0 frame 0
- TX packets 0 bytes 0 (0.0 B)
- TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0