容器從根本上改變了人們開發、發佈以及運行軟件的方式。軟件開發者能夠在本地構建軟件,由於他們知道軟件可以在任何主機環境下運行,不管是 IT 部門的機房、用戶的筆記本電腦,仍是雲端集羣,並且運行時並沒有差別。運維工程師只需專一於維護網絡和資源, 保證正常運行時間,減小了花在配置環境及解決系統依賴關係上的時間。從規模很小的創業公司,到規模龐大的企業,容器的使用率和理解程度正以驚人的速度提高。能夠預見,在將來幾年,開發者和運維工程師將以不一樣形式普遍使用容器技術。容器是對應用程序及其依賴關係的封裝。乍一看容器只是個輕量級的虛擬機,它和虛擬機同樣擁有一被隔離的操做系統實例,用來運行應用程序。但容器擁有一些優勢,使它能實現一些傳統虛擬機很難實現甚至沒法實現的用例。node
補充個知識點: 從容器內部訪問宿主機ip: mac:docker.for.mac.host.internal 其餘:docker.for.host.internalgit
你如今作了一個 xxxx 系統 or
xxx 軟件。可是你這個項目所用到的技術面很是的多,若是咱們按照正常手動的部署方式,那就是折騰服務器下載各類依賴、軟件、插件... 亂七八糟的各類配置。OK 對於喜歡愛折騰的人來講,我以爲這也是能夠使人接受的,可是想一想有一天你服務器崩了,或者須要換服務器,是否是又要來一遍騷操做,想想你的項目若是之後又增長了什麼功能有須要什麼依賴支持,那是否是還要折騰。github
使用 Docker 的好處不少,不光能夠解決上述的問題,並且還有如下幾點:redis
...docker
並且會 docker 會讓你找工做時多加幾分,同事之間談起來多幾分資本npm
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建以後也不會被改變json
容器是鏡像的實例化,實質運行與本身的獨立命名空間的進程。所以容器具備本身的 root 系統、網絡配置、進程空間、用戶ID空間等 相對於鏡像來講容器是動態的,容器在啓動的時候,以鏡像爲基礎層建立一層可寫層做爲最上層ubuntu
容器與虛擬機對比數組
倉庫的概念跟 git 相似,註冊服務器能夠理解爲 github、codding、gitlab、碼雲... 這樣的託管服務bash
...
請你們 移步 到另外一篇文章,裏面有詳細講解安裝 docker
與 docker-compose
咱們經過 docker search
來查看鏡像是否存在
$ docker search redis
複製代碼
接下來咱們經過 docker pull
來拉取鏡像
$docker pull redis
注意 tag:latest
這表示咱們拉取的最新的鏡像,如需其餘版本 在 docker pull redis:xxxx 跟上版本
$ docker images
複製代碼
docker inspect
查看鏡像元數據
$ docker inspect redis:latest
複製代碼
咱們使用 redis
這個鏡像來生成咱們的第一個容器
docker run -p 6379:6379 -v $PWD/data:/data --name redis-server -d redis:latest
複製代碼
docker ps 顯示當前正在運行的容器 若是再加上 -a 是全部容器
是否是感受比咱們本身在服務器下載一個redis要方便的多啊 不要急 慢慢往下看
docker exec
是須要容器處於運行中且 PID1 進程也處於運行中才能執行的操做。命令執行後會進入容器的默認工做目錄
$ docker exec -it redis-server /bin/sh
複製代碼
$ docker stop redis-server # 中止
$ docker start redis-rever # 啓動
$ docker rm redis-server # 刪除
複製代碼
有些人感受命令也很繁瑣 並且輸入錯了還要從頭來一次 並且不少東西也沒有配置 docker 也就這樣啊, 也是拉取一個個的鏡像而後構建容器配置
咱們繼續...
FROM ubuntu
MAINTAINER ruifengyun "push_over@163.com"
RUN apt-get update && apt-get -y install epel-release && apt-get -y install redis && apt-get -y install net-tools
EXPOSE 6379
ENTRYPOINT [ "/usr/bin/redis-server" ]
CMD []
複製代碼
建立後以後咱們就能夠執行 docker build .
. 不能被省略 切記必定要在Dockerfile文件所在的目錄
咱們經過 docker images 查看當前鏡像列表是否是多了一個ubuntu
們簡單說一下整個Dockerfile的內容:
首先選擇了基礎鏡像是ubuntu的最新版,而後填寫做者信息, 再以後更新軟件源, 下載安裝一些所須要的依賴並下載redis,隨即咱們又開放了6379端口
前面咱們使用 Docker 的時候,定義 Dockerfile 文件,而後使用 docker build、docker run 等命令操做容器。然而微服務架構的應用系統通常包含若干個微服務,每一個微服務通常都會部署多個實例,若是每一個微服務都要手動啓停,那麼效率之低,維護量之大可想而知
使用 Docker Compose 能夠輕鬆、高效的管理容器,它是一個用於定義和運行多容器 Docker 的應用程序工具
Docker Compose 將所管理的容器分爲三層,分別是工程(project)、服務(service)、容器(container) Docker Compose 運行目錄下的全部文件(docker-compose.yml)組成一個工程,一個工程包含多個服務,每一個服務中定義了容器運行的鏡像、參數、依賴,一個服務可包括多個容器實例
ps
列出全部運行容器
$ docker-compose ps
複製代碼
logs
查看服務日誌輸出
$ docker-compose logs
複製代碼
build
構建或者從新構建服務 必須在docker-compose.yml 文件同級下
$ docker-compose build
複製代碼
start
啓動指定服務已存在的容器
$ docker-compose start
複製代碼
stop
中止已運行的服務的容器
$ docker-compose stop
複製代碼
up
構建、啓動容器
$ docker-compose up
-d 後臺運行
複製代碼
咱們作一個簡單的實例
選擇一個目錄建立 Dockerfile
和 docker-compose.yml
文件
咱們來擼 docker-compose.yml
version: '3'
services:
redis:
image: redis
ports:
- 6379:6379
restart: always
mongo:
image: mongo
ports:
- 27017:27017
restart: always
volumes:
- ./mongo:/data/db
app:
build: . # 咱們接下來要擼的Dcokerfile
restart: always
command: npm start
environment:
- TZ=Asia/Shanghai
# volumes:
# - .:/app
# - /app/node_modules
ports:
- 7001:7001
depends_on:
- redis
- mongo
links:
- redis:redis
- mongo:mongo
複製代碼
繼續擼 Dcokerfile
FROM node:lts
# LABEL maintainer = "gaozan <push_over@163.com>"
# 環境變量
ENV NODE_ENV production
# 建立app目錄
# RUN mkdir /app
# 設置工做目錄
WORKDIR /app
# 拷貝package.json文件到工做目錄
# !!重要:package.json須要單獨添加。
# Docker在構建鏡像的時候,是一層一層構建的,僅當這一層有變化時,從新構建對應的層。
# 若是package.json和源代碼一塊兒添加到鏡像,則每次修改源碼都須要從新安裝npm模塊,這樣木有必要。
# 因此,正確的順序是: 添加package.json;安裝npm模塊;添加源代碼
COPY package*.json ./
# 安裝npm依賴(使用淘寶的鏡像源)
# 若是使用的境外服務器,無需使用淘寶的鏡像源,即改成`RUN npm i`。
RUN npm install --registry=https://registry.npm.taobao.org && npm install egg-scripts --save
# 指定時區
# RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 拷貝全部源代碼到工做目錄
COPY ./ /app
USER root
# 暴露容器端口
EXPOSE 7001
複製代碼
而後咱們須要執行 docker-compose up -d
啓動並在後臺運行
到這就是 docker 的一個簡單介紹和小demo 寫的很差的地方多多包含, 謝謝你們 請關注個人博客