[ドッカーエントリ(A)] https://blog.csdn.net/ck784101777/article/details/102496159
カスタムイメージ
1.カスタムイメージで使用されます
- 裸システム(最も簡単な構成)で、カスタムイメージを作成して、システムを保存
- 鏡で作られた、現在実行中のコンテナは、予約の変更します
- 他のホストに転送され、現在実行中のコンテナ
2.ミラー-commit方法
コンテナを実行します - >表示コンテナID->実行 - >ビューミラー
コマンド:ドッキングウィンドウは、新しいミラー・イメージID名をコミット
- [ルート@ docker1のdocker_images]#]ドッキングウィンドウの実行-it docker.io/centos //実行時の画像
- [ルート@のdocker1のdocker_images]#]ドッキングウィンドウのPS //ビューコンテナID
- [ルート@ docker1のdocker_images]#ドッキングウィンドウは8d07ecd7e345 docker.io/myos:latestをコミット
- SHA256:ac3f9c2e8c7e13db183636821783f997890029d687b694f5ce590a473ad82c5f
- [ルート@ docker1〜]#]ドッキングウィンドウの画像
- リポジトリタグ画像ID CREATED SIZE
- docker.io/myos最新87feda116c17 6週間前に321.6メガバイト
3.ミラー-Dockerfile方法
Dockerfileは、スクリプトは、手動でコンテナを起動する必要はありません方法でミラーリングされます。私たちは、手書きDockerfileという名前のファイルを必要とし、構文にいくつかのパラメータを設定します。そして、それを実行します
Dockerfile構文:
- FROM:ベース画像
- MAINTAINER:ミラー作成者情報(詳細)
- EXPOSE:開いているポート
- ENV:環境変数の設定
- ADD:ミラーにファイルをコピーします
- RUN:ミラーリングされたときにコマンドを実行し、&で区切られた複数の、複数のコマンドがあってもよいです
- WORKDIRは:デフォルトの作業ディレクトリコンテナを定義します
- CMD:コンテナの起動時にコマンドを実行し、あなただけのCMDを持つことができます
ケースを介して各パラメータの使用方法を説明するために、以下の実験のhttpdの容器を製造することです
- [ルート@ docker1〜]#1は、mkdir bulid //ディレクトリを作成します
- [ルート@のdocker1〜]#のCDのbulid
- [ルート@ docker1のbulid]#タッチDockerfile // Dockerfileが大文字に最初の文字を提出
- [ルート@のdocker1のbulid]#のCP /etc/yum.repos.d/local.repo ./ // YUMソース電流経路にコピーされます
- [ルート@ docker1 bulid] #echoテストは> index.htmlを//新しいHTMLページを作成します。
- [ルート@ docker1のbulid]#のvimのDockerfile //编辑Dockerfile
- docker.io/myos:latest //ベースイメージから、基準ミラーの名前を書くためにここに
- //はHTTPDをインストールするミラーリング時にyumを実行する-yコマンドを実行します。
- ENV EnvironmentFile =の/ etc /のsysconfig / httpdの//ときhttpdプロセスの実行環境と呼ばれる実行環境を、指定
- WORKDIR / var / www / htmlと設定/ //デフォルトの作業ディレクトリコンテナを定義します
- index.htmlのindex.htmlを// index.htmlの画像に現在のパスにコピーされます、という名前のindex.htmlを追加
- 80 //は開いているポートの数を設定して公開します
- CMD [ "は/ usr / sbinに/ httpdの"、 "-DFOREGROUND"] //にhttpdサービスを開始し、あなたが見つけることができるこのラインCMDはhttpdの-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 //アクセスそれは、我々だけで書かれた文書を
- テスト
第二に、民間の倉庫のミラーを作成します
ミラー倉庫・チャート、私たちは、このグラフを見てください。原画像生成に応じて、ミラーがハードタグ(タグ)を介して接続可能な第1の画像(鏡)とコンテナ(容器)、それらの間の関係との関係の実行をコミットし、ミラーを介して容器に実行します。ミラーリングされたコンテナがコミット作成し、コンテナおよび停止(停止)を行うことができますすることで、(スタート)を起動、再起動(再起動)コマンド
Dockerfileでは、ビルドコマンドによって生成された鏡像を構築するために使用され、このファイルを見て
その後backup.tarを、ミラーイメージは、ローカルミラーを読み取ることによって、ローカル保存、ロード・コマンドによって生成されました
ドッキングウィンドウのレジストリは倉庫のミラーで、倉庫は、プライベートとパブリックの倉庫に分けられ、倉庫保管ミラーリングは、我々がリポジトリにアップロードされた公共イメージをプッシュするところで、pullコマンドを介して画像をダウンロード
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〜]#のvimのの/ etc /のsysconfig /ドッカ
- ADD_REGISTRY = ' - アドオンレジストリをdocker1:5000' //倉庫を追加
- INSECURE_REGISTRY =「 - 安全でない - レジストリdocker1:5000」//セキュリティ機関によって、この倉庫
- [ルート@のdocker1〜]#systemctl再起動ドッカ//重启ドッカ
3)倉庫にローカルミラーをアップロード
最初の画像のラベルを作成するには、コマンド:ドッカタグ名新しいイメージ:新しいラベル名のIP /ホスト名:5000 /ミラー:ミラーラベル
次に、コマンドをアップロード:ドッカプッシュIP /ホスト名:5000 /ミラー:ミラーラベル
- 192.168.1.31:5000/docker.io/busybox:latest docker.io/busybox:latest [ルート@ docker1〜]#]ドッキングウィンドウタグ
- //タグ
- [ルート@の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