docker详细介绍
1 Docker概述
1.1 Docker為什么出現
環境配置是十分的麻煩,每一個機器都要部署環境(集群Redis、ES、Hadoop)!費事費力
發布一個項目(jar+(Redis MySQL jdk ES)),項目能不能都帶上環境安裝打包!
之前在服務器配置一個應用的環境Redis、MySQL、jdk、ES、Hadoop,配置超麻煩了,不能夠跨平臺,windins,最后發布到Linux!
Docker通過隔離機制,可以將服務器利用到極致。
1.2 Docker 的歷史
2010年,幾個搞IT的年輕人,就在美國成立了一家公司dotcloud,做一些pass的云計算服務!LXC有關的容器技術!他們將自己的技術命名為Docker。
Docker容器技術,也是一種虛擬化技術。
vm: linux centos原生鏡像(一個電腦),隔離,需要開啟多個虛擬機! docker:隔離,鏡像(最核心的環境 4m+jdk+mysql)十分小巧,運行鏡像就可以了Docker基于Go語言開發的
官網:https://www.docker.com/
文檔:https://docs.docker.com/
倉庫地址:https://hub.docker.com/
1.3 Docker能干嘛
之前的虛擬技術特點
虛擬技術特點:
比較Docker和虛擬機技術的不同
- 傳統虛擬機,虛擬出一個硬件,運行一個完整的操作系統,然后在這個系統上安裝和運行軟件。
- 容器內的應用直接運行在 宿主機的內容,容器是沒有自己的內核的,也沒有虛擬我們的硬件。
- 每個容器間是互相隔離。
DevOps(開發、運維)
應用更快速的交付和部署
傳統:一鍵幫助文檔,安裝程序
Docker:打包鏡像發布測試,一鍵運行
更便捷的審計和擴縮容
使用了Docker之后,我們部署應用就和搭積木一樣!
項目打包為一個鏡像,擴展,服務器A!服務器 B
更簡單的系統運維
在容器化之后,我們的開發沒測試環境都是高度一致的。
更高效的計算資源利用
Docker是內核級別虛擬化,可以在一個物理機上可以運行很多的容器實例!服務器的性能可以被壓榨到極致。
鏡像(image):
docker鏡像好比一個模板,可以通過這個模板來創建容器服務,tomcat鏡像==>run==>tomcat01容器(提供服務器),通過這個鏡像可以創建多個容器(最終服務運行或者項目運行就是在容器中的)
容器(container):
Docker利用容器技術,獨立運行一個或者一個組應用,通過鏡像來創建的。
啟動、停止、刪除、基本命令
目前就可以把這個容器理解為就是一個簡易的linux系統。
倉庫(respository):
倉庫就是存放鏡像的地方!
倉庫為公有倉庫和私有倉庫!
Docker Hub(默認是國外的)
阿里云…都有容器服務器(配置獎項加速!)
2 安裝Docker
環境準備
環境查看
# 系統內核是 3.10 以上的 [root@huawei ~]# uname -r 3.10.0-1160.45.1.el7.x86_64 # 系統版本 [root@huawei ~]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/"CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"安裝到centos
https://docs.docker.com/engine/install/centos/
# 1、卸載舊的版本 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 2、需要安裝包 yum install -y yum-utils# 3、設置鏡像的倉庫 yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo # 默認是國外的yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推薦阿里云# 更新yum軟件包索引 yum makecache fast# 4、安裝docker相關的社區 docker-ce:社區 ee:企業版 可以指定版本安裝 yum install docker-ce docker-ce-cli containerd.io# 5、啟動docker systemctl start docker# 6、查看是否成功 docker version# 7、啟動dock的helloword docker run hello-world # 8、查看一下下載的這個 hello-world鏡像 [root@huawei ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 18e5af790473 3 months ago 9.14kB了解:卸載docker
# 1、卸載依賴 yum remove docker-ce docker-ce-cli containerd.io# 2、刪除資源 rm -rf /var/lib/docker# /var/lib/docker docker的默認工作路徑2.1 容器鏡像服務/鏡像加速器
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://q5vcymug.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker2.2 底層原理
Docker如何工作
Docker是一個Client - Server的機構系統,Docker的守護進程運行在主機上,通過Socket從客戶端訪問。
DockerServer接收到Docker-Client的指令,就會執行這個指令。
3 Docker的常用命令
3.1 幫助命令
docker version # 顯示docker詳細信息 docker info # 顯示docker的系統信息 docker 命令 --help # 萬能命令幫助文檔地址
官網:https://www.docker.com/
文檔:https://docs.docker.com/
3.2 鏡像命令
3.2.1 images查看所有本地的主機上的鏡像
[root@huawei ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 18e5af790473 3 months ago 9.14kB# 解釋 REPOSITORY 鏡像的倉庫源 TAG 鏡像的標簽 IMAGE ID 鏡像的id CREATED 鏡像的創建時間 SIZE 鏡像的大小# 可選項 [root@huawei ~]# docker images --helpOptions:-a, --all # 列出所有鏡像-q, --quiet # 只顯示鏡像的id[root@huawei ~]# docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE hello-world latest 18e5af790473 3 months ago 9.14kB [root@huawei ~]# docker images -q 18e5af7904733.2.2 search搜索鏡像
倉庫地址:https://hub.docker.com/
[root@huawei ~]# docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 11977 [OK] mariadb MariaDB Server is a high performing open sou… 4586 [OK] # 可選項,通過 過濾 --filter=STARS=3000 # 搜索出來的鏡像就是STARS大于3000的3.2.3 下載鏡像
# 下載鏡像 docker pull 鏡像名[:tag] [root@vitloud ~]# docker pull mysql Using default tag: latest # 默認不寫tag。默認就是latest latest: Pulling from library/mysql 72a69066d2fe: Pull complete # 分層下載,docker image的核心 臨河文件系統 93619dbc5b36: Pull complete 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d5d7efb64e: Pull complete ac563158d721: Pull complete d2ba16033dad: Pull complete 688ba7d5c01a: Pull complete 00e060b6d11d: Pull complete 1c04857f594f: Pull complete 4d7cfa90e6ea: Pull complete e0431212d27d: Pull complete Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 # 簽名 Status: Downloaded newer image for mysql:latest docker.io/library/mysql:latest # 真實地址# 等價于它 docker pull mysql docker pull docker.io/library/mysql:latest# 指定版本 docker pull mysql:5.73.2.4 rmi 刪除鏡像
# 刪除指定的鏡像 docker rmi -f 容器刪除多個鏡像 # 刪除多個鏡像 docker rmi -f 鏡像id 鏡像id 鏡像id # 刪除全部鏡像 docker rmi $(docker images -aq)3.3 容器命令
說明:我們有了鏡像才可以創建容器,linux,下載一個centos鏡像來測試學習
docker pull centos3.3.1 新建容器并啟動
docker run [可選參數] image# 參數說明 --name="Name" 容器名字 tomcat01 tomcat02,用來區分容器 -d 后臺方式運行 -it 使用交互方式運行,進入容器查看內容 -p 指定容器的端口 -p 8080:8080-p ip:主機端口:容器端口-p 主機端口:容器端口(常用)-p 容器端口 -P 隨機指定端口# 測試,啟動 [root@vitloud ~]# docker run -it centos /bin/bash [root@b9c6a0c6922f /]# ls bin etc lib lost+found mnt proc run srv tmp var dev home lib64 media opt root sbin sys usr# 退出容器 [root@b9c6a0c6922f /]# exit3.3.2 列出所有的運行的容器
# docker ps 命令# 列出當前正在運行的容器 -a # 列出當前正在運行的容器+帶出歷史運行過的容器 -n=? # 顯示最近創建的容器 -q # 只顯示容器的編號[root@vitloud ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES [root@vitloud ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b9c6a0c6922f centos "/bin/bash" 19 minutes ago Exited (0) 10 minutes ago focused_easley 1df9d60c8713 feb5d9fea6a5 "/hello" About an hour ago Exited (0) About an hour ago exciting_wright [root@vitloud ~]# docker ps -a -n=1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b9c6a0c6922f centos "/bin/bash" 19 minutes ago Exited (0) 10 minutes ago focused_easley [root@vitloud ~]# docker ps -aq b9c6a0c6922f 1df9d60c87133.3.3 退出容器
exit # 直接退出容器 停止并退出Ctrl+P+Q # 容器不停止退出3.3.4 刪除容器
docker rm 容器id # 刪除指定的容器,不能刪除正在運行的容器,如果刪除 rm -f docker rm -f $(docker ps -aq) # 刪除所有的容器 docker ps -a -q|xargs docker rm # 刪除所有的容器3.3.5 啟動和停止容器的操作
docker start 容器id # 啟動容器 docker restart 容器id # 重啟容器 docker stop 容器id # 停止當前正在運行的容器 docker kill 容器id # 強制停止當前容器3.4 常用其他命令
后臺啟動容器
# 命令 docker run -d 鏡像名[root@vitloud ~]# docker run -d centos# 問題docker ps,發現centos停止了# 常見的坑:docker容器使用后臺運行,就必須要有一個前臺進程,docker發現沒有應用,就會自動停止# nginx,容器啟動后,發現自己沒有提供服務,就會立刻停止,沒有程序了查看日志
docker logs -f -t --tail 容器,沒有日志# 自己編寫一段shell腳本 docker run -d centos /bin/sh -c "while true;do echo charles;sleep 1;done"# 顯示日志 -tf # 顯示日志 --tail number # 要顯示日志條數 docker logs -tf --tail 10 容器id查看容器中進程信息ps
# 命令 docker top 容器id [root@vitloud ~]# docker top b737e6d65198 UID PID PPID C STIME TTY TIME CMD root 30155 30135 0 16:21 ? 00:00:00 /bin/sh -c while true;do echo charles;sleep 1;done root 30842 30155 0 16:23 ? 00:00:00 /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1查看鏡像的元數據
# 命令 docker inspect 容器id# 測試 [root@vitloud ~]# docker inspect e40bd5ee5f42 [{"Id": "e40bd5ee5f428de0d302d5225674494b9f8a0ef473020e64453d9ce5f890dd80","Created": "2022-01-18T05:53:11.094096961Z","Path": "/bin/bash","Args": [],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 10145,"ExitCode": 0,"Error": "","StartedAt": "2022-01-18T05:54:08.091386022Z","FinishedAt": "2022-01-18T05:53:19.328712684Z"},"Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6","ResolvConfPath": "/var/lib/docker/containers/e40bd5ee5f428de0d302d5225674494b9f8a0ef473020e64453d9ce5f890dd80/resolv.conf","HostnamePath": "/var/lib/docker/containers/e40bd5ee5f428de0d302d5225674494b9f8a0ef473020e64453d9ce5f890dd80/hostname","HostsPath": "/var/lib/docker/containers/e40bd5ee5f428de0d302d5225674494b9f8a0ef473020e64453d9ce5f890dd80/hosts","LogPath": "/var/lib/docker/containers/e40bd5ee5f428de0d302d5225674494b9f8a0ef473020e64453d9ce5f890dd80/e40bd5ee5f428de0d302d5225674494b9f8a0ef473020e64453d9ce5f890dd80-json.log","Name": "/optimistic_nobel","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": null,"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"CapAdd": null,"CapDrop": null,"CgroupnsMode": "host","Dns": [],"DnsOptions": [],"DnsSearch": [],"ExtraHosts": null,"GroupAdd": null,"IpcMode": "private","Cgroup": "","Links": null,"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "","UsernsMode": "","ShmSize": 67108864,"Runtime": "runc","ConsoleSize": [0,0],"Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": [],"BlkioDeviceReadBps": null,"BlkioDeviceWriteBps": null,"BlkioDeviceReadIOps": null,"BlkioDeviceWriteIOps": null,"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": [],"DeviceCgroupRules": null,"DeviceRequests": null,"KernelMemory": 0,"KernelMemoryTCP": 0,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": null,"CpuCount": 0,"CpuPercent": 0,"IOMaximumIOps": 0,"IOMaximumBandwidth": 0,"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/4aa7481d85fdf76c13d30a45e28b0c7c1928e5650b01684ed0f73a389c7ca8a4-init/diff:/var/lib/docker/overlay2/c4c09143f859ce4d4131ad826d74c3e2d569d1d6427ac3355440ce18edafde3c/diff","MergedDir": "/var/lib/docker/overlay2/4aa7481d85fdf76c13d30a45e28b0c7c1928e5650b01684ed0f73a389c7ca8a4/merged","UpperDir": "/var/lib/docker/overlay2/4aa7481d85fdf76c13d30a45e28b0c7c1928e5650b01684ed0f73a389c7ca8a4/diff","WorkDir": "/var/lib/docker/overlay2/4aa7481d85fdf76c13d30a45e28b0c7c1928e5650b01684ed0f73a389c7ca8a4/work"},"Name": "overlay2"},"Mounts": [],"Config": {"Hostname": "e40bd5ee5f42","Domainname": "","User": "","AttachStdin": true,"AttachStdout": true,"AttachStderr": true,"Tty": true,"OpenStdin": true,"StdinOnce": true,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd": ["/bin/bash"],"Image": "centos","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {"org.label-schema.build-date": "20210915","org.label-schema.license": "GPLv2","org.label-schema.name": "CentOS Base Image","org.label-schema.schema-version": "1.0","org.label-schema.vendor": "CentOS"}},"NetworkSettings": {"Bridge": "","SandboxID": "e28d746dea327807f66cf1db81411330eb1ec4185354e657acd4074d95bb1116","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/e28d746dea32","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "321471512f063aa634735de344af44e770cdf0ffa370c9fcf93f1be2fc447cf2","Gateway": "172.18.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.18.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:12:00:02","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "d4f59d9bb1fd1923f1910ce78a0325311670d22bdc67edc0b61b259fe6eae1c7","EndpointID": "321471512f063aa634735de344af44e770cdf0ffa370c9fcf93f1be2fc447cf2","Gateway": "172.18.0.1","IPAddress": "172.18.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:12:00:02","DriverOpts": null}}}} ]進入當前正在運行的容器
# 我們通常都是使用后臺方式運行的,需要進入容器,修改一些配置# 命令 docker exec -it 容器id bashShell# 測試 [root@vitloud ~]# docker exec -it e40bd5ee5f42 /bin/bash [root@e40bd5ee5f42 /]# psPID TTY TIME CMD15 pts/1 00:00:00 bash29 pts/1 00:00:00 ps [root@e40bd5ee5f42 /]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 05:54 pts/0 00:00:00 /bin/bash root 15 0 0 10:33 pts/1 00:00:00 /bin/bash root 30 15 0 10:33 pts/1 00:00:00 ps -ef# 方式二 docker attach 容器id # 顯示正在執行當前的代碼 # 測試# docker exec # 進入容器后開啟一個新的終端,可以在里面操作(常用) # docker attach # 進入容器正在執行的終端,不會啟動新的進程!從容器內拷貝文件到主機上
docker cp 容器id:容器內路徑 目的的主機路徑# 進入docker容器內部 [root@vitloud home]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f1faacd162b2 centos "/bin/bash" 11 minutes ago Up About a minute beautiful_volhard [root@vitloud home]# docker attach f1faacd162b2 [root@f1faacd162b2 /]## 容器內部新建文件 cd /home touch charles.java# 將文件拷貝到主機上 docker cp f1faacd162b2:home/charles.java /home# 拷貝是一個手動過程,未來我們使用 -v 卷的技術,可以實現4 Docker鏡像講解
4.1 鏡像是什么
鏡像是一種輕量級、可執行的獨立軟件包,用來打包軟件運行環境和基于運行環境開發的軟件,它包含運行某個軟件所需的所有內容,包括代碼、運行時、庫、環境變量和配置文件。
所有的應用,字節打包docker鏡像,就可以直接跑起來
如何得到鏡像:
- 從遠程倉庫下載
- 朋友開唄給你
- 自己制作一個鏡像DockerFile
4.2 commit鏡像
docker commit 提交同期成為一個副本# 命令和git原理類似 docker commit -m="提交的描述信息" -a="作者" 容器id 目標鏡像名:[TAG]實戰測試
# 啟動一個默認的tomcat docker run -it -p 8080:8080 tomcat# 交互方式進入 docker exec -it 48629b5a69d2 /bin/bash# 發現這個默認的tomcat是沒有webapps應用,鏡像原因,官方的鏡像默認webapps下面是沒有文件的 cd /usr/local/tomcat cp -r webapps.dist/* webapps# 測試: http://42.192.168.139:8080/# 我自己拷貝進去了基本的文件提交鏡像
# 將我們操作過commit提交為一個鏡像!我們以后就使用修改過的鏡像 [root@vitloud ~]# docker commit -a="有勇氣的牛排" -m="add webapps app" 48629b5a69d2 tomcat02:1.0 sha256:6ed708230b48f3055366b6660be3488a78cecd02ce69524988495f420a08ec96[root@vitloud ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat02 1.0 6ed708230b48 4 seconds ago 684MB5 容器數據卷
5.1 什么事容器數據卷
docker的理念回顧
數據?如果數據都在容器中,那么我們容器刪除,數據就會丟失!
需求:數據可以持久化
MySQL,容器刪了,刪庫跑路 =需求:MySQL數據可以存儲在本地=
容器之間可以有一個數據共享的技術!Docker容器中產生的數據,同步到本地!
這就是卷技術,目錄的掛載,將我們容器內的目錄,同步到linux上面
總結一句話:容器的持久化和同步操作!容器間也是可以數據共享的
5.2 使用數據卷
方式一:直接使用命令阿里掛載 -v
雙向綁定
docker run -it -v 主機目錄:容器目錄 # -it: 交互方式打開 # -v: 目錄映射# 掛載 docker run -it /home/test:/home centos /bin/bash# 查看容器詳細信息 docker inspect 容器id# 進入正在運行的容器命令行 docker attach 容器id好處:我們以后修改只需要本地修改即可,容器內會自動同步!
5.3 實戰安裝MySQL
5.4 具名和匿名掛載
docker run -d -P --name nginx01 -v /etc/nginx nginx# 具名掛載 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx[root@vitloud test]# docker volume ls DRIVER VOLUME NAME # 這里發現,這種就是匿名掛載,我們在 -v 只寫了容器內的路徑,沒有寫容器外的路徑 local 56e4e9bdc3013de9a822167a62e2a6fcae0564eeab6ad44849c6ea8b9fa002b9 # 具名掛載 local juming-nginx[root@vitloud test]# docker volume inspect juming-nginx [{"CreatedAt": "2022-01-19T23:50:25+08:00","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data","Name": "juming-nginx","Options": null,"Scope": "local"} ]所有的docker容器內的卷,沒有指定目錄的情況下都是在/var/lib/docker/volumes/xxx/_data
我們同過具名掛載可以方便的找到我們的一個jaunty,大多數情況下在使用具名掛載
# 如何確定是具名掛載還是匿名掛載,還是指定路徑掛載! # -v: 容器內路徑 # 匿名掛載 # -v: 卷名: 容器內路徑 # 具名掛載 # -v: /宿主機路徑:容器內路徑 # 指定路徑掛載擴展:
# 通過 -v 容器內路徑: ro rw 改變讀寫權限 # ro read only # 只讀 # rw read write # 可讀 可寫# 一旦設定了容器權限,容器對我們掛載出來的內容具有限定了 docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx6 初識DockerFile
Dockerfile就是用來構建docker鏡像的構建文件!命令腳本
通過這個腳本可以生成鏡像
方式二:
cd /home/docker-test-volume # 進入到所要映射的文件夾 vim dockerfile1dockerfile1 文件內容
# 創建一個dockerfile文件,名字可以隨機,建議Dockerfile # 文件中的內容 指令(大寫)參數FROM centos VOLUME ["volume01","volume02"] # 掛載多個目錄---匿名掛載 CMD echo "------end------" CMD /bin/bash構建:生成自己的容器鏡像
# 生成一個charles的centos # -f: dockerfile地址 docker build -f /home/docker-test-volume/dockerfile1 -t charles/centos:1.0 .啟動
docker run -it 234904ca1213 /bin/bash# 查看容器信息 docker inspect ab29c6fed6f3# Mounts里面查看 "Source": "/var/lib/docker/volumes/***"這個卷和外部一定有一個同步目錄
6.1 數據卷容器
多個mysql同步數據
6.2 DockerFile構建過程
dockerfile是用來構建docker鏡像的文件!命令參數腳本
構建步驟:
基礎知識:
dockerfile是面向開發的,我們以后要發布項目,做鏡像,就需要編寫dockerfile文件,這個文件十分簡單。
Dokcer鏡像逐漸成為了企業交付的標準,必須要掌握
步驟:開發、部署、運維—>缺一不可
DokcerFile:構建文件,定義了一切的步驟,源代碼
DockerImages:通過DockerFile構建生成的鏡像,做種發布和運行的產品
Docker容器:容器就是鏡像運行起來提供服務
6.3 DockerFile的指令
以前用別人的,現在用自己寫的
FROM # 基礎鏡像,一切從這里開始構建 centos MAINTAINER # 鏡像是誰寫的:姓名+郵箱 RUN # 鏡像構建的時候需要運行的命令 ADD # 步驟:tomcat鏡像,這個tomcat壓縮包,添加內容 WORKDIR # 鏡像的工作目錄 VOLUME # 掛載的目錄 EXPOSE # 暴露端口配置 CMD # 指定這個容器啟動的時候運行的命令,只有最后一個會生效,可被替代 ENTRYPOINT # 指定這個容器啟動的時候要運行的命令,可以追加命令 ONBUILD # 當構建一個被繼承 DokcerFile 這個時候就會運行 ONBUILD 的指令,觸發指令 COPY # 類似ADD,將我們文件拷貝到鏡像中 ENV # 構建的時候,設置環境變量6.4 實戰測試
構建自己的centos
# 1.編寫dockerfile的文件 [root@vitloud dokcerfile]# cat mydockerfile-centos FROM centos MAINTAINER vitcloud<vitcluod@163.com>ENV MYPATH /usr/local WORKDIR $MYPATHRUN yum -y install vim RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATH CMD echo "---end---" CMD /bin/bash2.通過這個文件構建鏡像
-f: 確定dokcerfile文件
命令:docker build -f dockerfile文件路徑 -t 鏡像名:[tag]
docker build -f mydockerfile-centos -t mycentos:0.1 .3.運行
docker run -it mycentos:0.1查看鏡像歷史操作
docker history 鏡像id6.5 CMD域ENTRYPOINT區別
測試cmd
CMD # 指定這個容器啟動的時候運行的命令,只有最后一個會生效,可被替代 ENTRYPOINT # 指定這個容器啟動的時候要運行的命令,可以追加命令 vim dokcerfile-cmd-test FROM centos CMD ["ls","-a"]構建
docker build -f dokcerfile-cmd-test -t cmdtest .運行
[root@vitloud dokcerfile]# docker run c283225a5675 . .. .dockerenv bin dev etc ...# 想追加一個命令 -l ls -al [root@vitloud dokcerfile]# docker run c283225a5675 -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown. ERRO[0000] error waiting for container: context canceled# cmd的清理下 -l 替換了CMD["ls","-a"]命令,不是命令,所以報錯展示出了所有 目錄
測試entrypoint
# 1.編輯文件 vim dockerfile-cmd-entrypointFROM centos ENTRYPOINT ["ls","-a"]# 2.構建 docker build -f dockerfile-cmd-entrypoint -t entorypoint-test .#3. 測試 docker run 71f5cc4f29f8docker run 71f5cc4f29f8 -l6.6 實戰:Tomcat鏡像
1、 準備鏡像文件tomcat壓縮包,jdk壓縮包
2、 編寫dockerfile文件
Dockerfile:官方命名,build會自動尋找這個文件
# 編輯Dockerfile文件 FROM centos MAINTAINER vitcloud<vitcloud@163.com>COPY readme.txt /usr/local/readme.txtADD jdk-8u191-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.58.tar.gz /usr/local/RUN yum -y install vimENV MYPATH /usr/lcoal WORKDIR $MYPATHENV JAVA_HOME /usr/local/jdk1.8.0_191 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarENV CATALINA_HOME /usr/local/apache-tomcat-9.0.58 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.58ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080CMD /usr/local/apache-tomcat-9.0.58/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.58/bin/logs/catalina.out# 3 構建 docker build -t diytomcat .4 啟動鏡像
docker run -d -p 9090:8080 --name blog-tomcat -v /usr/local/docker-build/tomcat/test:/usr/local/apache-tomcat-9.0.58/webapps/test -v /home/vitcloud-docker-build/tomcatlogs/:/usr/local/apache-tomcat-9.0.58/logs diytomcat進入容器
docker exec -it 654c26bc7abb /bin/bash6、發布項目(由于做了卷掛載,我們字節在本地編寫項目就可以發布了)
<web-app version="3.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID"> </web-app> <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>云間來客</title> </head> <body><div>測試日志</div> </body> </html>6.7 發布自己的鏡像
DockerHub
地址:https://hub.docker.com/
# 幫助 docker login --help# 登錄 docker login -u 用戶名# 推動自己的鏡像到 DockerHub docker push vitcloud/tomcat:1.0給鏡像添加tag
docker tag d89b35c35d33 vitcloud/tomcat:1.0發布到阿里云鏡像服務
容器鏡像服務
7 Docker網絡
7.1 理解Dokcer0
docker run -d -P --name tomcat01 tomcat docker run -d -P --name tomcat02 tomcatdocker exec -it tomcat01 ip addr # 如果報錯 沒有庫ip addr無效的,進入容器執行: docker exec -it e40bd5ee5f42 /bin/bash apt update && apt install -y iproute2docker exec -it tomcat02 ip addr原理
1、每啟動一個docker容器,docker就會給docker容器分配一個ip,我們只要安裝了dokcer,就會有一個網卡docker0交接模式
# 我們發現這個容器帶來的網卡,都是一對對的, # evth-pair,就是一對的虛擬設備接口,他們都是成對出現的,一端連著協議,一端彼此相連。 # 正式因為有這個特性,evth-pair,充當一個橋梁,連接各種虛擬挽留過設備的 # OpenStac,Docker容器之間的連接,OVS的連接,都是使用evth-pair技術7.2 docker – link
思考一個場景,我們編寫了一個微服務,database url=ip,項目不重啟,數據庫ip換掉了,我們系統可以處理這個問題,可以用名字來訪問服務器
docker run -d -P --name tomcat01 tomcat docker run -d -P --name tomcat02 tomcatdocker run -d -P --name tomcat03 --link tomcat02 tomcat# 通過--link可以解決(官方不推薦) docker exec -it tomcat03 ping tomcat02docker0問題:他不支持容器名連接訪問
7.3 自定義網絡
容器互聯:
docker network --help# 查看所有docker網卡docker network ls# 移除網卡docker network rm 網卡名網絡模式:
bridge:橋接docker(默認)
none:不配置網絡
host:和宿機共享網絡
container:容器內網絡連通(用的少)
# 我們直接啟動的命令 # 默認參數:--net bridge docker run -d -P --name tomcat01 tomcat docker run -d -P --name tomcat01 --net bridge tomcat# docker0特點:默認,域名不能訪問,--link可以打通連接# 創建自定義網絡 # 子網最多支持:65535個 # 默認路由:192.168.0.1 # --driver bridge # --subnet 192.168.0.0/16 # --gateway 192.168.0.1[root@vitloud /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet 42338184f369e514885027b4c8e9971e27004f3139e66211e4e12c4a2dd99704[root@vitloud /]# docker network ls NETWORK ID NAME DRIVER SCOPE d4f59d9bb1fd bridge bridge local 5f7a85590719 host host local 42338184f369 mynet bridge local 12cb0d955bf9 none null local# 啟動容器 測試 docker run -d -P --name tomcat-net-01 --net mynet tomcat docker run -d -P --name tomcat-net-02 --net mynet tomcat# ping docker exec -it tomcat-net-01 ping 192.168.0.3好處:
redis:不同的集群使用不同的網絡,保證集群是安全和健康的
mysql:
7.4 網絡連通
容器連接到網絡
# 容器:tomcat01 # 網絡:mynet docker network connect mynet tomcat01Docker Compose
Docker Swarm
CI/CD Jenkins流水線
學習地址:
狂神說:https://www.bilibili.com/video/BV1og4y1q7M4
總結
以上是生活随笔為你收集整理的docker详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker命令基础 简洁版本
- 下一篇: Dokcer进阶之Compose 实战官