docker使用學習筆記

  • 2019 年 11 月 2 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/luo4105/article/details/102837587

docker介紹

docker是個容器,採用沙盒啟動,類似虛擬機。

docker的架構是C/S,遠程倉庫存放image(鏡像),本地下載image(鏡像),並根據image(鏡像)本機創建container(容器),一個容器就是一個運行的系統。

docker可以執行--help來查看命令API

docker start --help

docker下載後需要啟動守護進程,它會跑著本機後台,啟動方式 – 啟動docker.app

open /Applications/Docker.app

macos通過命令行啟動docker後台服務

通過 launchctl 查看 docker server, 記住docker server 名

launchctl list | grep docker    111117   0       com.docker.docker.2388

然後關閉和啟動它。

launchctl stop com.docker.docker.2388 && launchctl start com.docker.docker.2388
容器(container)

docker創建容器並啟動命令

docker run ubuntu:15.10 /bin/echo "Hello world"

docker會在本地找到ubuntu:15.10鏡像並啟動容器,容器使用bin/echo列印"Hello world"。

查看所有容器

docker ps -a
docker ps -a    CONTAINER ID    IMAGE                                   COMMAND         CREATED       STATUS              PORTS                                                        NAMES    b10c13741118    ubuntu:15.10                                "/bin/bash"       56 minutes ago   Exited (100) 54 minutes ago                                                              hardcore_dewdney    cc36ecdbfdd1    ubuntu:15.10                                "/bin/sh -c 'while t…"  About an hour ago  Exited (137) About an hour ago                                                            practical_herschel

會列出所有容器,啟動或者非啟動的。COMMAND是啟動命令,可以通過CONTAINER IDNAMES啟動、關閉、刪除指定容器,ports是埠綁定,如0.0.0.0:80->80/tcp就是本地容器80埠綁定到本地80埠。

docker start 73d44474e7a0  73d44474e7a0  docker stop 73d44474e7a0  73d44474e7a0  docker rm 73d44474e7a0  73d44474e7a0

rm只能刪除未啟動的容器

查看容器日誌

docker logs 73d44474e7a0  docker logs -f 73d44474e7a0

-f是實時監控列印。

進入容器

進入容器實際是進入容器並使用/bin/bash終端應用,使用exec命令

docker exec -it 73d44474e7a0 /bin/bash

也可以在容器中安裝ssh工具進行連接。

鏡像(image)

鏡像就是一個作業系統的模版,根據鏡像docker生成一個又一個容器。鏡像放在docker遠程倉庫中,與mvn,git類似。

查看本地鏡像

docker images

repository是鏡像名,通過repository生成容器;image_id是鏡像id,可以通過image_id刪除鏡像。

刪除鏡像

docker image rm dcba8021e01d6549a1ae8feabc5e1eca5cf746c1

生成容器

docker run -i -t ubuntu
docker run -i -t ubuntu:15.10

如果不指定版本,它會下載最新版本鏡像並生成容器啟動。-t是Allocate a pseudo-TTY,一個遠程連接的終端。

生成鏡像

對於修改的容器,可以生產自定義鏡像

docker commit 0e143e309026ed84d489f87757d20f625aafb4c5226ec5bed5902f53db5e2bc5 ubuntu/luocheng

查看更多命令

docker image --help

搜索網上鏡像

docker search python

下載鏡像

docker pull python
dockerFile

dockerFile是一個構建docker鏡像的命令行文件,裡面的指令告訴docker如何去下載並配置鏡像。

FROM nginx:1.15.12    COPY ./nginx.conf/total.conf /etc/nginx/conf.d/default.conf  COPY ./run.sh /app/run.sh    EXPOSE 80    CMD ["/app/run.sh"]

FROM是鏡像來源,copy是要執行的操作,EXPOSE是暴露埠,cmd是要執行的命令。

docker build luocheng/ngnix .

luocheng/ngnix是鏡像名,.是鏡像文件所在的目錄。

docker-compose

docker-compose是一個支援批量啟動容器的自動化工具。需要定義一個.yml文件,裡面寫好將要執行的命令,一般是通過dockerfile構建鏡像和容器,並啟動它們,docker-compose執行這個.yml文件,將文件中的鏡像和容器都構建號並打開。

services:    redis:      image: redis:4.0      volumes:        - redis-data:/data      ports:        - "6379:6379"    mariadb:      image: mariadb:10.0      environment:        - MYSQL_ROOT_PASSWORD=luocheng123        - MYSQL_USER=luocheng        - MYSQL_PASSWORD=luocheng123        - MYSQL_DATABASE=luocheng        - TZ=Asia/Shanghai      volumes:        - ./mysql/conf.d:/etc/mysql/conf.d        - ./mysql/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d        - mysql-data:/var/lib/mysql      ports:        - "3306:3306"    volumes:    redis-data: {}

docker-compose還有一些自定義命令。

查看列印日誌

docker compose logs helloworld

啟動項目

docker compose start helloworld

更新並啟動項目

docker-compose up helloworld
docker特效和原理

docker運行於作業系統,但與作業系統共用磁碟,記憶體,這使得這種虛擬化技術可以讓一台伺服器上部署很多個docker容器,而不像虛擬機記憶體和磁碟與作業系統完全分開,不能共用。

docker雖然共用記憶體,磁碟,但是容器之間不能直接通訊,訪問,是完成獨立的;在容器內使用ps命令,只能看到該容器的進程,無法看到其他容器的進程,說明它們的進程也是獨立分開的;網路也是分開的;還能歸約docker對硬體的使用,如設置幾個cpu,設置最大多少記憶體。

隔離用的技術是linux的命名空間,這個命名空間和多用戶登陸類似。硬體資源的控制和管理使用linux系統的CGroups功能。docker的核心虛擬化功能都是使用linux自帶的功能。就好像coding的核心功能也是git文件版本管理,它做的是git外業務,展示等。