Docker基础入门详解
一、產生背景
在傳統軟件開發流程中,研發程序員將功能代碼研發完成后,交由測試人員進行測試,最后通過運維人員部署上線。但是在這個過程中,常常因為環境問題、配置問題、軟件版本問題等等諸多因素,造成一些問題。Docker技術的出現就是為了解決因部署實施而帶來的一系列問題。
Docker技術實現了將開發環境、相關軟件、配套環境等一系列研發環境打包成鏡像文件,交由測試人員、運維人員使用。這樣就減少了因部署而帶來的一系列扯皮問題。除此之外,Docker提供了很多現成鏡像,可以由用戶直接使用,減少了一些中間件的安裝。
總之,Docker方便了軟件的安裝部署,實現了一個鏡像,多處復用的效果。
個人理解:
在固定服務器,固定服務的場景下,不需要使用Docker技術。因為開發環境,測試環境,上線環境,都是固定不變的。不管是開發,測試還是運維,都是基于固定的環境和軟件開展工作的。
而對于一個服務,多處部署的應用場景,比較適合使用Docker技術。例如互聯網大廠中,一個產品項目可能需要往全國甚至全世界多個機房中心中部署,那么這種場景就比較適合使用Docker技術。
二、什么是Docker
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何流行的 Linux或Windows操作系統的機器上,也可以實現虛擬化。
虛擬化容器:
Docker采用虛擬化容器技術,虛擬化容器是在操作系統層面實現虛擬化,直接復用本地主機的操作系統,而虛擬化出容器所需的資源。虛擬化出來的容器是容器所具備功能所需的最小資源,沒用的功能和組件,不會出現在容器中。所以Docker容器具有體積小的特性。這也是為何Docker容器中輸入很多linux命令不識別的原因。因為沒用的組件和功能,容器中默認是不攜帶的。
虛擬化容器與虛擬機比較:
傳統虛擬機技術是在硬件層面實現的虛擬化技術,它將虛擬化出來一套完整的操作系統。而Docker容器是在本地主機操作系統基礎上,虛擬化出來所需功能組件的最小容器。因此,傳統虛擬機技術所產生的鏡像比Docker容器的鏡像更大,更笨重。
三、Docker基本組成
前提條件
Docker要求運行在linux系統上,linux系統內核要求在3.8以上。在Centos系統上,要求centos7以上,64位操作系統?,F在衍生出了Windows版本,其本質還是使用linux系統內核,只不過在Windows系統上模擬出了linux系統內核。
Docker由鏡像、容器和倉庫組成:
鏡像
這里的鏡像,和傳統虛擬機中的.iso鏡像,有異曲同工之處。傳統虛擬機中的.iso鏡像文件放在虛擬機中,可以創建出操作系統實例來。在Docker中的鏡像,可以創建出Docker容器實例。上面說過,Docker容器并不是整個操作系統,而是所需功能的最小容器。
鏡像就是一個模板,可以創建出很多容器實例。
容器
Docker鏡像啟動起來的每一個實例,都稱之為容器。例如,redis鏡像啟動的容器,就是redis服務。mysql鏡像啟動的容器,就是mysql服務等。
倉庫
存放鏡像的地方,就是Docker的倉庫。其機制類似于Maven倉庫或git倉庫。只不過存放的是Docker鏡像。分為本地倉庫和遠程倉庫。本地倉庫就是宿主機本地存放鏡像的地方。本地倉庫沒有的鏡像,可以從遠程倉庫拉取。遠程倉庫分為公共遠程倉庫和私有遠程倉庫。公共遠程倉庫有Docker Hub或阿里云倉庫。私有遠程倉庫就是公司 內部自己搭建的Docker倉庫。私有遠程倉庫可安裝Docker registry軟件進行搭建。具體操作這里不再記錄。Docker倉庫運行流程如下:
我們自定義的鏡像,也可以上傳到遠程倉庫,供別人拉取使用。阿里云倉庫是付費的。
甜點: 在個人安裝Docker的宿主機上,可配置阿里云提速器,來加快鏡像的遠程拉取速度。這里注意要區分與配置阿里云遠程倉庫地址。配置阿里云遠程倉庫地址可以用來加快拉取速度,因為Docker Hub是國外網站,拉取速度較慢。而這里 說的配置阿里云提速器,是在配置了阿里云倉庫后,更進一步的提速效果。具體的配置方式是登陸自己的阿里云賬號,然后搜索容器鏡像服務,然后點擊此選項,然后選擇鏡像提速器菜單,安裝上面操作配置即可,如下圖所示:
可以看出這是跟個人賬號掛鉤的一個操作,在個人學習時,可以配置使用。
四、Docker基本操作命令大全
系統級別命令
鏡像相關命令
輸出字段及含義如下圖:
其中一個鏡像可以有多個TAG版本存在。使用某個版本,可以通過鏡像名稱:TAG來指定。當版本為latest時,可以省略:TAG。否則必須使用鏡像名稱:TAG。
可以列出鏡像,如下圖所示:
其中OFFICAL代表是否官方。優先選擇官方鏡像進行拉取。這里只是搜索鏡像,并不包含具體版本號,一般鏡像包含了各個版本。我們可以直接在鏡像名后面加我們想要的版本即可。如果不加版本,默認拉取latest版本。
在Docker Hub官網,也可以搜索某個鏡像。
如果不加TAG,默認拉取最新的。
鏡像啟動的所有實例必須停止運行才可以刪除鏡像。
容器相關命令
參數:
--name xxx #指定容器名稱為xxx -d #后臺運行,并返回容器ID,此方式開啟容器后不進入容器 -it #其實是-i和-t兩個參數,一般都在一起使用,開啟交互式容器,啟動容器后進入容器內部 -p 宿主機port:容器port #指定宿主機端口與容器端口對應關系。可在宿主機上通過此端口訪問容器服務 -v 宿主機路徑:容器內部路徑 #將容器內部某個路徑掛載到宿主機上,實現數據的同步和持久化- 后臺啟動容器命令:
- 交互啟動容器命令:
在交互式容器啟動時,需要在命令后面加上/bin/bash或bash命令,這樣才能進入容器內部,與容器內部進行交互。這點需要特別注意。
退出容器:
交互式進入容器后,如果退出容器到宿主機呢?兩種方式:
ctrl+D或exit命令退出容器,容器也會停止。
ctrl+p+q退出容器,容器不會 停止。
文件掛載:
在容器中的數據,會隨著容器的刪除而刪除,而且容器中配置文件的修改,需要先進入容器才能修改。使用文件掛載參數-v,將容器內文件與宿主機文件進行映射后,容器內文件和宿主機映射文件就會保持同步,在宿主機修改配置文件,容器內 對應配置文件也會修改(容器重啟后生效)。在容器內產生的數據,在宿主機映射文件也會產生相應數據。
例如在redis容器或mysql容器中,都需要將配置文件和數據文件進行掛載,一個是便于配置文件的修改,一個是對redis日志或mysql數據進行持久化保持。
掛載命令:
其中--priviledge=true是授權參數,最好 加上,否則有時會出問題。
2. 查看容器實例命令:
查詢正在運行的容器實例:
查看正在運行和已經停止的容器實例:
docker ps -a這里需要注意,當用某個鏡像啟動容器后,容器就會在宿主機存在。即使這個實例停止運行了,那么這個容器還是存在的,我們可以繼續啟動這個容器。
- 啟動某個容器命令:
關閉某個容器命令:
docker stop 容器ID刪除容器命令:
docker rm 容器ID刪除容器后,容器才會在宿主機消失。刪除容器是rm,刪除鏡像是rmi,其中這個i就代表image鏡像的意思。
上面講到啟動一個后臺運行的容器,那么如果 想進入這個容器做交互,應該如何進去呢?執行以下命令:
退出按ctrl+D退出即可,因為是后臺運行啟動的,這樣退出也不會停止容器運行。
還有一個進入容器內部的命令:
docker attach 容器ID這種方式很少用,原因如下:
3. 查看容器詳情命令:
返回json格式容器詳情信息,內容很多,如下所示:
[{"Id": "3d25328ac0bbab7525caadf322e1df54ef6ca776f258f6c415f6019d1514824f","Created": "2022-08-28T06:55:02.245198929Z","Path": "docker-entrypoint.sh","Args": ["redis-server"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 21683,"ExitCode": 0,"Error": "","StartedAt": "2022-08-28T06:55:04.16474428Z","FinishedAt": "0001-01-01T00:00:00Z"},"Image": "sha256:3edbb69f9a493835e66a0f0138bed01075d8f4c2697baedd29111d667e1992b4","ResolvConfPath": "/var/lib/docker/containers/3d25328ac0bbab7525caadf322e1df54ef6ca776f258f6c415f6019d1514824f/resolv.conf","HostnamePath": "/var/lib/docker/containers/3d25328ac0bbab7525caadf322e1df54ef6ca776f258f6c415f6019d1514824f/hostname","HostsPath": "/var/lib/docker/containers/3d25328ac0bbab7525caadf322e1df54ef6ca776f258f6c415f6019d1514824f/hosts","LogPath": "/var/lib/docker/containers/3d25328ac0bbab7525caadf322e1df54ef6ca776f258f6c415f6019d1514824f/3d25328ac0bbab7525caadf322e1df54ef6ca776f258f6c415f6019d1514824f-json.log","Name": "/keen_noether","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/ef1cb55fe9ba3130296f2cecc676be442e78e76524b2b58a1ba0ef58aac39879-init/diff:/var/lib/docker/overlay2/8c626981a567a606070bdc8e00a103eed11d0859dcfce2763b37a4f2e257b668/diff:/var/lib/docker/overlay2/c19216a0ddf38928401b118816cda02bd497603ec3109647bd147eabef3c2dd8/diff:/var/lib/docker/overlay2/2d98fdbbe975db2295a238830f740242863eb62834e1c1288e9096f88aea17b6/diff:/var/lib/docker/overlay2/df05555cfad1eec6219f2cb14ec183be109d09f04a4a245dd755b619551492b8/diff:/var/lib/docker/overlay2/40df4c9e096704ba37d1e916faf0f02a012bd061b6883de5a3c12699b2f30e41/diff:/var/lib/docker/overlay2/f12fbd3a76a4f40e20699b214a894a19c32d6650b3824ed7fb7f47876531866d/diff","MergedDir": "/var/lib/docker/overlay2/ef1cb55fe9ba3130296f2cecc676be442e78e76524b2b58a1ba0ef58aac39879/merged","UpperDir": "/var/lib/docker/overlay2/ef1cb55fe9ba3130296f2cecc676be442e78e76524b2b58a1ba0ef58aac39879/diff","WorkDir": "/var/lib/docker/overlay2/ef1cb55fe9ba3130296f2cecc676be442e78e76524b2b58a1ba0ef58aac39879/work"},"Name": "overlay2"},"Mounts": [{"Type": "volume","Name": "9bd2c45c0f4711a8291c6eb4a2607aa20f9e23b402facef0be854925dfbba76f","Source": "/var/lib/docker/volumes/9bd2c45c0f4711a8291c6eb4a2607aa20f9e23b402facef0be854925dfbba76f/_data","Destination": "/data","Driver": "local","Mode": "","RW": true,"Propagation": ""}],"Config": {"Hostname": "3d25328ac0bb","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"6379/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOSU_VERSION=1.14","REDIS_VERSION=7.0.4","REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-7.0.4.tar.gz","REDIS_DOWNLOAD_SHA=f0e65fda74c44a3dd4fa9d512d4d4d833dd0939c934e946a5c622a630d057f2f"],"Cmd": ["redis-server"],"Image": "redis","Volumes": {"/data": {}},"WorkingDir": "/data","Entrypoint": ["docker-entrypoint.sh"],"OnBuild": null,"Labels": {}},"NetworkSettings": {"Bridge": "","SandboxID": "adfae3e2a0fae1e742453439bfe09024f92eb951b72eb4e363b965ff913c9c75","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {"6379/tcp": null},"SandboxKey": "/var/run/docker/netns/adfae3e2a0fa","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "2a3d532504abe9f43339fb9cd9e8021a726641819e7ce25e7c0ac4148a6bb925","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:02","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "7667f6780a0f4b166b8487b3eca53cd6754fb92d16d599283ca3129f35c3a808","EndpointID": "2a3d532504abe9f43339fb9cd9e8021a726641819e7ce25e7c0ac4148a6bb925","Gateway": "172.17.0.1","IPAddress": "172.17.0.2","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:02","DriverOpts": null}}}} ]其中包含了容器的網絡模式,ip,鏡像,狀態,掛載情況(Mounts)等等信息。總之容器的全部信息都可以在這里找到。
4. 其他容器命令
- 查看容器日志命令:
此命令在后臺運行容器時使用,可以查看容器內服務運行日志。特別是容器運行失敗或容器內服務出現問題時,可以通過該命令快速瀏覽容器軟件所產生的日志。
查看容器內部進程:
docker top 容器ID復制容器內文件到宿主機:
docker cp 容器ID:容器內文件路徑 宿主機存放文件路徑五、Dockerfile
什么是Dockerfile
上面我們講到可以從遠程倉庫拉取現成的Docker鏡像。那我們該如何制作自己的鏡像呢?比如我們的項目打成jar包,在jdk里運行,想要把jdk環境和jar包制作成一個鏡像,供其他人通過Docker進行運行,該如何做呢?這就用到了Dockerfile技術。
Dockerfile是構建Docker鏡像的文本文件,是由一條條構建鏡像所需的指令和參數構成的腳本。
Dockerfile就是基于某個基礎鏡像,對鏡像的一個增強腳本。比如,基于centos鏡像,要安裝jdk8環境,并且要運行我們項目的jar包?;蛘咄鵦entos鏡像中添加ifconfig命令的功能,或者vim命令的功能。這都算是對基礎鏡像的一個增強。通過編寫Dockerfile腳本文件,構建出一個新的鏡像,包含上述的增強功能。
構建Dockerfile三步曲
- 編寫Dockerfile文件
- 使用Dockerfile文件構建鏡像
- 運行生成的鏡像容器
如下圖所示:
Dockerfile語法指令
上面提到Dockerfile是一個腳本文件,用來構建鏡像增強。docker定義了Dockerfile的一些關鍵字指令(保留字指令)。這些指令特性如下:
下面看都有哪些指令:
- FROM:
指定加強鏡像是基于哪個鏡像做加強的。寫在Dockerfile第一行。基于哪個鏡像,用鏡像名稱:TAG表示即可。 - MAINTAINER:
Dockerfile作者和郵箱地址,可選項 - RUN:
用Dockerfile文件構建鏡像時執行的命令,支持shell格式和exec格式兩種。一般使用shell命令。在docker build構建鏡像時執行RUN 后面定義的shell命令。 - EXPOSE:
容器服務對外暴露的端口。如tomcat鏡像暴露8080端口,就是容器中tomcat暴露的端口。 - WORKID:
指定交互式進入容器后默認到達的目錄,一個落腳點。 - USER:
指定鏡像以什么用戶來執行,如果不指定,默認是root用戶。 - ENV:
用來構建鏡像過程中設置環境變量。以k v形式定義。例如: ENV MYPATH /usr/local/tomcat表示設置MYPATH環境變量為/usr/local/tomcat。在Dockerfile中,就可以使用$MYPATH來代表這個路徑。 - VOLUME:
容器數據卷,用于保存和持久化工作。等同于docker run -v 參數,在這里定義后無需在容器啟動時指定了。 - ADD:
將宿主機文件拷貝到容器中,并解壓。即宿主機中壓縮文件拷貝到容器后,會自動解壓出來。默認拷貝Dockerfile同級目錄下的文件。所以要將Dockerfile文件和要拷貝進容器的文件放在同一個目錄下。 - COPY:
類似于ADD命令,只不過沒有自動解壓功能。一般使用ADD命令。 - CMD:
定義在容器啟動后,執行的命令。也是支持shell格式和exec格式。
CMD [“可執行文件”,“參數1”,“參數2”…] 在容器啟動后,執行shell命令,一般用于啟動容器中的服務。例如tomcat容器中定義CMD命令,就是在tomcat容器啟動后,執行CMD后面的命令,啟動tomcat服務。
Dockerfile文件中可以定義多個CMD命令,但只有最后一個生效。CMD會被docker run后面的參數替換。替換是當docker run后面的參數與CMD指令的作用相沖突時,以指令參數為準。當作用不沖突時,是疊加效果。
需要注意的是,RUN指令后面的shell腳本是構建鏡像時執行的命令,CMD指令是容器啟動后執行的命令。
- ENTRYPOINT:
也是在容器啟動時執行命令,類似于CMD。與CMD的區別是ENTRYPOINT不會被docker run后面的命令所覆蓋(不理解這句話含義)。命令格式: ENTRYPOINT [“可執行文件”,“參數1”,“參數2”]。
ENTRYPOINT 作為啟動容器的運行命令時,CMD命令就不再是運行命令了,而是ENTRYPOINT的一個參數。如上圖例子,衍生出來的命令其實就是 nginx -c /etc/nginx/nginx.conf。其中nginx -c 是ENTRYPOINT命令,其是不會被用戶后續追加命令覆蓋的,后面的/etc/nginx/nginx.conf是CMD命令,其不再是運行命令,而是參數命令。而且它也保留CMD特性,會被后面的CMD命令所覆蓋。如用戶自定義了 -c /etc/nginx/new.conf后就將之前CMD命令覆蓋了。
tomcat Dockerfile文件查看
在Docker Hub上搜索tomcat鏡像,并選擇第一個搜索結果(官方鏡像),點進去后,選擇自己想要查看的版本,如下圖所示:
這里看Dockerfile腳本文件的最后兩行:
可以看到,tomcat容器暴露出來端口是8080,且容器啟動后,執行catalina.sh命令。這就是啟動tomcat服務的命令。所以啟動tomcat鏡像后,tomcat也就自動啟動了。
注意:
當以交互式啟動tomcat鏡像時,不要加/bin/bash命令,因為這樣會覆蓋掉最后的CMD命令。這樣就不會執行tomcat啟動命令。這樣容器 雖然啟動了,但是tomcat沒有運行。所以遇到這種情況時,就不要以交互式方式啟動了,先以后臺方式啟動,然后再進入容器內部。
Dockerfile構建鏡像
命令:
docker build -t 新鏡像名字:TAG構建好的鏡像自動進入docker本地鏡像倉庫,并不會生成具體某個可看見的文件。其中TAG版本號自己定義即可。定義好容器后啟動容器即可。
Docker執行Dockerfile的大致流程如下:
虛懸鏡像
在使用Dockerfile構建鏡像時,有時會出現虛懸鏡像。所謂虛懸鏡像就是鏡像名稱和TAG都是none的鏡像。虛懸鏡像產生的原因可能是Dockerfile在一層一層的生成新的鏡像時,所產生的垃圾鏡像,沒有用,直接刪掉即可。
六、網絡模式
查看網絡模式命令:
docker network lsdocker默認網絡模式有如下三種:
bridge橋接模式
橋接模式是最常用的模式,也是默認模式。Docker服務會默認創建一個docker0網橋,如下圖所示:
這樣,每一個容器都會有自己的一個ip,ip網段和docker0的網段一樣。這樣就可以實現容器之間,容器與宿主機之間的通信。如下圖所示:
其中,docker0是網橋,起到交換機的作用。網橋ip一般為172.17.0.1。容器ip為172.17.0.2等等。需要注意的是,容器每次重啟后,ip都不是固定的,是隨機變化的。
Host模式
想使用Host模式,在docker run命令后加參數–network host或-net host即可。使用host模式,容器ip和端口用宿主機ip和端口就行。Host模式容器詳情中網絡模式如下:
自定義網絡模式
docker支持自定義網絡模式。我們除了上述幾種網絡模式外,我們可以自定義網絡模式,命令如下:
docker network create 網絡名稱自定義創建的網絡模式,本質還是用橋接模式。只不過網絡名稱是自己定義的。那么自定義網絡模式有何作用呢?
自定義網絡模式是為了解決容器每次啟動后,ip都會變化造成的問題。例如我們在連接數據庫,redis時,配置文件寫ip地址進行連接。當容器重啟后,ip變了。那么數據庫就連接不上了。
容器使用自定義網絡后,就可以通過容器名稱進行容器的連接了。當連接mysql容器,redis容器的服務與mysql容器、redis容器都在同一個自定義網絡時,就可以通過寫容器 名稱來代替ip地址,進行mysql和redis的連接。這樣就規避了ip變化帶來的問題。
需要注意的是,所有的容器必須都在一個自定義網絡中,且啟動容器時必須通過 --name指定容器名稱。如果不指定名稱,docker自動生成的名稱也不能通過容器名稱訪問。雖然自定義網絡也是橋接模式,但是使用默認的橋接模式是不能通過容器名訪問的。
七、Dockerfile創建jar包鏡像
jdk8鏡像制作
首先,基于centos基礎鏡像制作jdk8鏡像,編寫Dockerfile文件:(Dockerfile文件和jdk8安裝包需要在同一目錄)
vim Dockerfile FROM centos:7ENV MYPATH /usr/local WORKDIR $MYPATH#安裝vim編輯器 RUN yum -y install vim #安裝ifconfig命令 RUN yum -y install net-tools #安裝java8及lib庫 RUN yum -y install glibc.i686 RUN mkdir /usr/local/java #ADD 是相對路徑,jdk包和Dockerfile文件必須同一個目錄下 ADD jdk-8u281-linux-x64.tar.gz /usr/local/java #配置java環境變量 ENV JAVA_HOME /usr/local/java/jdk1.8.0_281 ENV JRE_HOME $JAVA_HOME/jre ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH ENV PATH $JAVA_HOME/bin:$PATHEXPOSE 80CMD echo $MYPATH CMD echo "success" CMD /bin/bashjar包鏡像制作
基于上述制作好的jdk8鏡像,制作jar包鏡像:(Dockerfile文件和jar包需在同一目錄下)
vim Dockerfile FROM centosjava8:1.5 MAINTAINER xiaoxiaosu #VOLUME指定臨時文件目錄為tmp,在主機/var/lib/docker目錄下創建一個臨時文件并連接到容器的tmp VOLUME /tmp ADD gulimall-product-0.0.1-SNAPSHOT.jar gulimall-product-0.0.1-SNAPSHOT.jar #運行jar包 RUN bash -c 'touch gulimall-product-0.0.1-SNAPSHOT.jar' ENTRYPOINT ["java","-jar","gulimall-product-0.0.1-SNAPSHOT.jar"] EXPOSE 10001八、Docker-Compose技術
簡介
Docker-Compose是Docker官方開源項目,負責對Docker容器集群的快速編排。需要編寫一個docker-compose.yml文件,在里面通過命令管理多個Docker容器,管理多個容器之間的協調,來共同服務于一項項目。通過docker-compose.yml進行多個容器的一鍵啟停操作。
docker-compose需要單獨安裝。可參考文章:docker-compose教程(安裝,使用, 快速入門)
使用步驟
1.編寫Dockerfile并構建各個微服務鏡像
2.使用docker-compose.yml定義一個完整的業務單元,安排好整體應用程序中各個容器服務
3.執行docker-compose up命令,一鍵啟動項目
compose相關命令
docker-compose.yml文件編寫
詳細配置可參考文章:docker-compose.yml的詳細解釋與說明
下面是一個自己練習的demo:
寫完yml文件后,通常執行下面命令檢查編寫的yml文件是否有問題:
docker-compose config -p如果沒有任何輸出,代表編寫yml文件沒問題。在docker-compose.yml中都規定同一個自定義網絡模式,在就可以使用服務名進行通信了,如mysql連接,redis連接等,都可以使用docker容器實例名配置。
一鍵部署,一鍵啟停,十幾個二十幾個docker實例用docker-compose編排就可以。再多了就考慮引入K8s。中小型公司用docker-compose足夠了。
九、監控統計
輕量級使用Portainer監控工具進行監控。docker用命令能完成的工作,都可以使用Potainer工具進行圖形操作,例如拉取鏡像,啟動容器,查看容器詳情,查看網絡等等,總之一切可以用命令完成的操作,都可以用Portainer圖形操作完成。
重量級的健康使用CAdvisor+InfluxDB+grafana進行監控。但是需要用到重量級監測的體諒的項目,直接使用K8s了,所以很少使用Docker的這個監控。
總結
以上是生活随笔為你收集整理的Docker基础入门详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第05课:Redis 实际应用中的异常场
- 下一篇: 2011年新的个人纳税情况