開源的應用容器引擎mysql
打包環境和應用到一個輕量級,可移植的容器中,發佈到任何 Linux 機器上,規避了軟件跨環境遷移的問題nginx
沙箱機制,相互隔離sql
sudo apt install docker-ce
守護進程(daemon):後臺服務,管理一個 Docker 進程docker
鏡像(image):至關於一個 root 文件系統,打包了環境和應用shell
容器(container):鏡像運行時的實體,能夠被建立,啓動,暫停, 中止,刪除json
倉庫(repository):保存鏡像文件flask
sudo systemctl start docker
sudo systemctl status docker
sudo systemctl stop docker
sudo systemctl restart docker
sudo docker images
# 查看具體版本號須要去 hub.docker.com sudo docker search ubuntu
# 配置阿里雲加速:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors sudo vim /etc/docker/daemon.json { "registry-mirrors": ["加速地址"] } sudo systemctl daemon-reload sudo systemctl restart docker # 拉取鏡像 sudo docker pull ubuntu[:版本]
sudo docker rmi ubuntu[:版本]
# 要查看全部包括已中止運行的容器:加上參數 -a sudo docker ps
# -i:保持STDIN打開,-t:交互模式,bash:自定義進入容器後執行的命令 # -it 啓動的容器稱爲交互式容器,exit 命令退出後容器會自動中止 sudo docker run -it --name u1 ubuntu[:版本] bash # -d:後臺建立容器,不會當即進入 # -id 啓動的容器稱爲守護式容器,exit 退出時容器也不會自動中止 sudo docker run -id --name u1 ubuntu[:版本]
# 只能進入正在運行的容器 sudo docker exec -it u1 bash
# 這種方式啓動容器後 exit 退出時也不會自動中止 sudo docker start u1
sudo docker stop u1
# 不能刪除正在運行的容器 sudo docker rm u1
sudo docker inspect u1
# 建立啓動容器時,-v 參數設置 # 容器內目錄必須是絕對路徑,宿主機目錄能夠相對,但相對的是 /var/lib/docker/volumes/,並非當前路徑 # 目錄不存在會自動建立,而文件不存在時會被當成目錄建立並掛載 # 可用多個 -v 掛載多個 sudo docker run ... -v 宿主目錄(文件):容器內目錄(文件) ... --name u1 ubuntu[:版本]
配置一個專門的容器來掛載數據卷,其餘容器掛載這個容器(這時候至關於掛載同一個數據卷)來交換數據ubuntu
sudo docker run ... -v 宿主目錄(文件):容器內目錄(文件) ... --name u1 ubuntu[:版本] # 其餘容器掛載 u1 sudo docker run ... --volumes-from u1 --name u2 ubuntu[:版本] sudo docker run ... --volumes-from u1 --name u3 ubuntu[:版本]
sudo docker search mysql sudo docker pull mysql:5.7
# 宿主機建立MySQL目錄用來存儲數據信息 mkdir mysql cd mysql # 端口映射 宿主機:容器 sudo docker run -id \ -p 3306:3306 \ -v $PWD/conf.d:/etc/mysql.d \ -v $PWD/logs:/logs \ -v $PWD/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=111 \ --name m1 mysql:5.7
mkdir nginx cd nginx # 若是須要默認配置,可先啓動一個容器將默認配置複製一份,不然宿主機空文件掛載後會覆蓋容器內文件 # sudo docker cp n1:/etc/nginx/nginx.conf nginx.conf sudo docker run -id \ -p 80:80 \ -v $PWD/nginx.conf:/etc/nginx/nginx.conf \ -v $PWD/conf.d:/etc/nginx/conf.d \ -v $PWD/logs:/var/log/nginx \ --name n1 nginx
這種方式並不經常使用,由於打包後體積巨大不利於傳遞。vim
# 原容器中掛載的目錄(文件)不會被提交到鏡像 sudo docker commit 容器名(id) 鏡像名[:版本號] # 鏡像打包 sudo docker save -o 文件名 鏡像名[:版本號] # 鏡像還原 sudo docker load -i 文件名
# 最後的 . 表示當前路徑,是上下文目錄,構建時會將路徑下全部文件發給Docker引擎供 COPY ADD 等命令調用 # 若是配置文件名不爲 Dockerfile,可用 -f 指定文件名 sudo docker build -t 新鏡像名 .
微服務架構系統中通常包含多個微服務,每一個微服務通常會部署多個實例,若是手動管理工做量就會很大:bash
服務編排就是按照必定的規則批量管理容器的方法。Docker Compose 是一個編排多容器分佈式部署的工具,提供命令集管理容器化應用的完整生命週期,使用步驟:
sudo apt install docker-compose
mkdir project cd project # 建立nginx我的配置目錄,一下子作映射 mkdir -p nginx/conf.d
version: '3' services: # 定義一個容器 nginx1: # 能夠自定義容器名 container_name: main_nginx image: nginx ports: - "80:80" # 連接到另外一個容器後即可以直接訪問 links: - flask1 # 這裏簡單起見對默認配置不作修改,僅掛載自定義配置 volumes: - ./nginx/conf.d:/etc/nginx/conf.d flask1: container_name: main_flask # 能夠基於一份Dockerfile製做鏡像並建立容器,若是同時指定image會以它命名鏡像 # 這裏假設已經在當前目錄下寫好了flask鏡像的Dockerfile build: context: . dockerfile: ./Dockerfile image: img_flask # 暴露端口,並無與宿主機作映射,只容許被連接容器訪問 expose: - "8000" # 若是容器內沒有前臺常駐進程,構建完後會當即退出,加上tty參數分配一個僞終端 # tty: true
server { listen 80; # 監聽80端口來自外部的請求 server_name _; # 若是映射了域名,能夠代替_ # 爲HTTP規則 / 設置轉發 location / { proxy_pass http://flask1:8000; # 轉發到本地端口 } }
# 若是配置文件名不爲 docker-compose.yml,可用 -f 指定文件名 # 後臺啓動 -d sudo docker-compose up
sudo docker-compose ps
# 可經過 sudo docker-compose start 再次啓動 sudo docker-compose stop # 刪除全部中止狀態的容器 sudo docker-compose rm # 中止並刪除容器,網絡 # --rmi all/local (刪除compose文件中定義的全部鏡像)/(刪除鏡像名爲空的鏡像) # -v 刪除已經在compose文件中定義的和匿名的掛載在容器上的數據卷 sudo docker-compose down