[고정 표시기 항목 (a)] https://blog.csdn.net/ck784101777/article/details/102496159
사용자 정의 이미지
1. 사용자 지정 이미지에 사용하는 경우
- 벌거 벗은 시스템 (가장 간단한 구성)로, 사용자 정의 이미지를 만들고 시스템을 저장
- 거울로 만든 현재 실행중인 컨테이너는, 예약 변경
- 현재 실행중인 컨테이너는 다른 호스트로 전송
2. 미러 -commit 방법
컨테이너를 실행 ->보기 컨테이너 ID -> 실행 ->보기 미러
명령 : 고정 표시기는 새로운 미러 이미지 ID 이름을 커밋
- [루트 @의 docker1의 docker_images] # 고정 표시기 실행 - 그것은 docker.io/centos는 // 런타임 이미지
- [루트 @의 docker1의 docker_images] # 고정 표시기 추신 //보기 컨테이너 ID
- [루트 @의 docker1의 docker_images] # 고정 표시기는 8d07ecd7e345 docker.io/myos:latest 커밋
- SHA256 : ac3f9c2e8c7e13db183636821783f997890029d687b694f5ce590a473ad82c5f
- [루트 @의 docker1는 ~] # 고정 표시기 이미지
- REPOSITORY TAG 콘텐츠 ID CREATED SIZE
- 전 docker.io/myos 최신 87feda116c17 육주 321.6 MB
3. 미러 -Dockerfile 방법
Dockerfile 수동으로 컨테이너를 시작하는 스크립트가 필요하지 않은 방법으로 미러링됩니다. 우리는 필기 Dockerfile라는 이름의 파일이 필요하고, 구문의 일부 매개 변수를 구성합니다. 그런 다음 실행
Dockerfile 구문 :
- FROM : 기본 이미지
- MAINTAINER : 거울 작성자 정보 (설명)
-에 노출 : 열린 포트
- ENV : 환경 변수 설정
- ADD : 거울에 파일을 복사
- 실행 미러링 때 명령 실행, 복수로 구분 다중 명령이있을 수있다
- WORKDIR : 기본 작업 디렉토리 컨테이너를 정의
- CMD : 컨테이너의 시작, 당신은 단지 CMD를 가질 수 있습니다 때 명령 실행
사례를 통해 각 매개 변수의 사용을 설명하기 위해 다음과 같은 실험의 컨테이너 아파치를 생산하는 것입니다
- [루트 @의 docker1 ~] #에서 mkdir의 bulid // 디렉토리를 생성
- [루트 @의 docker1 ~] #에서 cd bulid
- [루트 @의 docker1의 bulid] # 터치 Dockerfile // Dockerfile는 대문자로 첫 글자를 파일
- ./ // 냠 소스가 현재 경로에 복사됩니다 /etc/yum.repos.d/local.repo [루트 @의 docker1의 bulid] #의 CP
- [루트 @의 docker1의 bulid] #echo 테스트> index.html을 // 새로운 HTML 페이지 만들기
- [루트 @의 docker1의 bulid] # 정력 Dockerfile // 编辑 Dockerfile
- // 기본 이미지 docker.io/myos:latest FROM, 여기에 참조 미러 이름을 쓰기
- // 설치 미러링 할 때 RUN이 냠 -y 명령을 실행하려면 아파치
- ENV = EnvironmentFile은 / etc / SYSCONFIG / 아파치 때 아파치 프로세스 실행 환경 칭한다 실행 환경을 지정할 //
- WORKDIR의 / var / www / html / // 기본 작업 디렉토리 컨테이너를 정의
- index.html을 index.html을 // index.html을 이미지에 현재 경로에 복사됩니다, index.html이라는 담기
- 80 //은 열린 포트의 수를 설정 노출
- CMD [ "는 / usr / sbin에 / 아파치", "-DFOREGROUND"] // 아파치 서비스를 시작, 당신이 찾을 수있는이 라인 CMD는 아파치 -T 볼
- [루트 @의 docker1의 bulid] # 고정 표시기는 -t docker.io/myos:http을 구축 할 수 있습니다. // 추가하는 것을 잊지 마십시오. 그것은 현재의 경로를 나타냅니다
- [루트 @의 docker1의 bulid] #은 -d docker.io/myos:http을 실행 고정 표시기
- d9a5402709b26b42cd304c77be442559a5329dc784ec4f6c90e4abac1c88e206
- [루트 @의 docker1의 bulid] # 고정 표시기는 D9 // IP보기 컨테이너를 검사
- [루트 @의 docker1의 bulid] # 컬 172.17.0.7 // 액세스가, 우리가 작성한 문서를
- 테스트
둘째, 개인 창고 미러를 생성
거울웨어 하우스 차트, 우리는이 차트를 봐주세요. 먼저 이미지 (거울)과 용기 (용기), 이들 미러를 통해 용기 내로 실행 관계의 실행을 위탁 관계가, 미러는 원 화상 생성에 따른 하드 태그 (태그)를 통해 연결될 수있다. 작성하여 미러링 된 컨테이너는 커밋, 용기 및 시작 (시작), 다시 시작 (다시 시작) 명령을 정지 (정지)를 수행 할 수 있습니다
Dockerfile에서 빌드 명령에 의해 생성 된 이중 이미지를 구성하는데 사용되는 파일이,보고
이어서 backup.tar, 거울상 로컬 미러를 판독하여 로컬 저장,로드 명령에 의해 생성 된
도커 레지스트리 창고의 거울이다, 창고는 민간 및 공공 창고로 구분되어, 창고 보관 미러링 우리가 저장소에 업로드 공공 이미지를 밀어 곳이다, 풀 명령을 통해 이미지를 다운로드
1. 개인 창고를 사용자 정의
1) 설치 창고
개인 창고를 만들기 고정 표시기-배포 서비스를 설치해야합니다
창고 이미지 메모리 주소의 경우 : / var / lib 디렉토리 / 레지스트리
창고 구성 파일 : /etc/docker-distribution/registry/config.yml
- [루트 @의 docker1의 bulid] # yum을 고정 표시기 분포를 설치
- [루트 @의 docker1의 bulid은] # 서비스를 시작 // 고정 표시기 분포를 시작 systemctl
- [루트 @의 docker1의 bulid] # 개의 systemctl는 고정 표시기 분포를 가능하게
2) 구성 파일을 수정
업로드 이미지 (전용 개인 창고) HTTPS 검증을 닫고 창고를 추가해야
- [루트 @의 docker1는 ~] #vim / etc / hosts 파일은 //는 DNS를 추가
- 192.168.1.31의 docker1
- [루트 @의 docker1 ~] # 정력을 / etc / SYSCONFIG / 고정 표시기
- ADD_REGISTRY은 = '- 추가 레지스트리 docker1 : 5000'// 창고를 추가
- INSECURE_REGISTRY = '- 불안 - 레지스트리 docker1 : 5000'// 보안 당국이웨어 하우스
- [루트 @의 docker1 ~] # 개의 systemctl 다시 시작 고정 표시기 // 重启 고정 표시기
3) 창고 로컬 미러 업로드
첫 번째 이미지에 대한 레이블을 만들려면 명령 : 고정 표시기 태그 이름 새 이미지 : 새 레이블 이름의 IP / 호스트 이름 : 5000 / 거울 : 거울 라벨
그런 다음 명령을 업로드 : 고정 표시기 푸시 IP / 호스트 이름 : 5000 / 거울 : 거울 라벨
- [루트 @의 docker1 ~] 192.168.1.31:5000/docker.io/busybox:latest docker.io/busybox:latest # 고정 표시기 태그를
- // 태그
- [루트 @의 docker1 ~] # 고정 표시기 푸시 192.168.1.31:5000/docker.io/busybox:latest
- // 업로드
- 192.168.1.31:5000/ docker.io/myos:http docker.io/myos:http [루트 @의 docker1 ~] # 고정 표시기 태그
- [루트 @의 docker1 ~] # 고정 표시기 푸시 192.168.1.31:5000/docker.io/myos:http
4) 다른 호스트 이미지를 다운로드
웨어 하우스의 미러 이미지를 다운로드하려면 고정 표시기 - 유통 서비스를 설치해야하고, 구성 파일을 수정
- [루트 @의 docker2 ~] # yum을 고정 표시기 분포를 설치
- [루트 @의 docker2는 ~] # 서비스를 시작 // 고정 표시기 분포를 시작 systemctl
- [루트 @의 docker2는 ~] #의 systemctl는 고정 표시기 분포를 가능하게
- [루트 @의 docker2는 ~] #vim / etc / hosts 파일은 //는 DNS를 추가
- 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