Docker安裝與應用

1、docker安裝

一、快捷安裝

快捷安裝參考: https://get.daocloud.io/#inst...
curl -sSL https://get.daocloud.io/docker | sh

二、手動安裝

1.)先查看內核,更新yum包node

docker要求CentOS系統的內核版本>3.10
$ uname -r
$ sudo yum update

2.)安裝依賴包linux

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

3.)設置國內docker鏡像源nginx

$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4.)若是安裝過,卸載舊版本git

$ sudo yum remove docker docker-common docker-selinux docker-engine

5.)查看倉庫中全部docker,安裝web

$ yum list docker-ce --showduplicates | sort -r
$ sudo yum install docker-ce
$ docker -v # 測試

三、啓動/關閉docker服務**

$ sudo systemctl start docker
$ sudo systemctl stop docker

# 加入隨機啓動
$ sudo systemctl enable docker

2、docker經常使用命令

每次使用docker命令都須要sudo,比較麻煩,能夠經過如下命令添加當前用戶到docker附屬組:
$ sudo usermod -aG docker 當前用戶名  # 須要註銷後登陸生效

1.)查看容器/鏡像redis

$ docker ps  # 查看本地容器
$ docker images  # 查看本地鏡像

# 查看容器詳情
$ docker inspect xxx

# 查看容器top進程
$ docker top xxx

2.)下載鏡像mongodb

建立容器前,可先下好遠程鏡像,也能夠在建立時再下載
# 先查找遠程鏡像
$ docker search xxx
$ docker pull xxx

3.)新建容器docker

最少參數的建立
# -d:表示後臺運行,-it:表示以交互的方式建立,可視化時可經過console打開
$ docker run -d -it --name 容器名 --restart always 鏡像名
更多參數:映射端口、dns、持久存儲卷、初始化進程防容器退出
# -p:映射端口,--dns:有些容器默認dns解析服務配置不對(/etc/resolv.conf),-v:映射路徑(可重複多個),/bin/sh:保持一個進程運行,不然容器會退出
$ docker run -dit -p 宿主端口:容器端口 --dns=8.8.8.8 --name 容器名 -v 宿主路徑:容器路徑 --restart always 鏡像:標籤 /bin/sh

docker中安裝centos沒法使用systemctl命令管理進程,報如下錯誤:
Failed to get D-Bus connection: Operation not permittedshell

緣由:須要特權才能啓動systemd進程,解決方案:
docker run -dit --privileged 其它參數 init

4.)啓動/中止容器npm

$ docker start | restart xxx  # 啓動/重啓

$ docker stop xxx  # 中止容器
$ docker kill xxx  # 強行終止,關閉進程

5.)進入容器

# 多窗口同時進入,會同步顯示,容易窗口阻塞,適合本地開發
$ docker attach xxx

# 或者,docker在1.3.X版本,新命令
$ docker exec -it xxx /bin/bash

6.)刪除容器/鏡像

# 刪除容器前,先中止
$ docker stop xxx 
$ docker rm xxx

# 刪除鏡像
$ docker rmi xxx  # -f 強制刪除

7.)容器/鏡像更名

# 容器更名
$ docker rename 原容器名 新容器名

# 鏡像更名
$ docker tag 原鏡像 新鏡像 # 會生成一個新名,鏡像id同樣
$ docker rmi 原鏡像

3、鏡像構建

一、手動構建鏡像

用基礎鏡像建立一個容器,手動安裝好一切,而後用容器生成鏡像:
$ docker commit 容器名 新鏡像名

二、自動構建鏡像:Dockerfile

1.)Dockerfile配置

新建Dockerfile並配置相關內容,下面以配置一個基於alpine的pm2安裝並運行node應用爲例:
# 基礎鏡像源
FROM alpine

# 建立者信息
MAINTAINER hoby <w.hoby@qq.com>

#修復時區
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' > /etc/timezone

# RUN命令:構建過程當中執行,經常使用於安裝軟件包
RUN echo 'nameserver 8.8.8.8' >> /etc/resolv.conf \
    && apk update \
    && apk add bash \
    && apk add nodejs && apk add npm \
    && npm config set registry https://registry.npm.taobao.org \
    && npm i -g pm2

# 指定工做目錄,用絕對
WORKDIR /app

# 從宿主機copy到容器
#COPY ./www.js /app

# 與COPY相似,但ADD自帶解壓功能
#ADD ./x.tar.xz /app

# 定義環境變量
ENV NODE_ENV=production

# 配置entrypoint入口腳本
RUN echo 'console.log("this is node web!")' > ./www.js \
    && echo '#!/bin/bash' > ./entrypoint.sh \
    && echo 'pm2 start /app/www.js' >> ./entrypoint.sh \
    && echo '/bin/sh' >> ./entrypoint.sh \
    && chmod a+x ./entrypoint.sh

# 容器啓動後執行的命令,且不可被docker run提供的參數覆蓋
ENTRYPOINT ["/bin/sh", "./entrypoint.sh"]

# 容器啓動後默認執行的命令,可被docker run後面的參數代替
#CMD ["/bin/sh"]

# 暴露端口
EXPOSE 80
運行構建命令:
$ docker build -t myimage:latest .  # 鏡像名需小寫
# 新建並啓動容器
$ docker run -dit -p 8000:80 --dns=8.8.8.8 --name 容器名 --restart always myimage:latest

2.)Dockerfile構建總結

a. 構建時下載不了軟件包,說明容器dns不對,需修改/etc/resolv.conf
b. alpine鏡像默認sh終端,需安裝bash
c. 建議一個容器只運行單個應用,多個應用見下文compose部署
d. Docker鏡像構建是分層,將多個RUN指令合併
e. -v持久化路徑時,若宿主機路徑是新建的,容器路徑內容會被清空
f. 當ENTRYPOINT與CMD使用exec參數時需雙引號
g. 添加.dockerignore,提升編譯速度:
.git/
node_modules/

4、多個應用容器部署

Docker Compose是一個管理多容器應用的工具

一、docker-compose安裝

Compose下載地址: https://get.daocloud.io/#inst...
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

二、docker-compose文件配置

新建docker-compose.yml,下面以nginx+node+mongo+redis聯合容器配置爲例:
version: '3'
services:
    web:
        image: nginx
        container_name: encore-web
        restart: always
        ports:
            - 18001:8001
        volumes:
            - ./bin/nginx.conf:/etc/nginx/conf.d/encore.conf
            - ./web/dist:/app/encore/web
        command: ['nginx', '-g', 'daemon off;']
        links:
            - server

    server:
        image: keymetrics/pm2
        container_name: encore-server
        restart: always
        ports:
            - 18100:8100
        volumes:
            - ./server:/app/encore/server
        working_dir: /app/encore/server
        environment:
            - MONGO_SERVER=mongo
            - MONGO_PORT=27017
            - REDIS_SERVER=redis
            - REDIS_PORT=6379
        command: npm start
        links:
            - mongo
            - redis

    mongo:
        image: mongo
        container_name: encore-mongo
        restart: always
        ports:
            - 18017:27017
        volumes:
            - ./mongo/configdb:/data/configdb
            - ./mongo/db:/data/db
        command: mongod --auth

    redis:
        image: redis
        container_name: encore-redis
        restart: always
        ports:
            - 18379:6379
        volumes:
            - ./redis/data:/data
            - ./bin/redis.conf:/usr/local/etc/redis.conf
        command: redis-server /usr/local/etc/redis.conf
須要注意的:
a.) command支持exec和shell兩種模式(見上面的web和server)
b.) nginx、pm2等進程需加--no-daemon參數使其在前臺運行,以保證容器不退出
c.) npm start須要設置工做目錄
d.) links後,在容器可直接把服務名作爲一個hostname訪問,以下:
# nginx反向代理
proxy_pass http://server:8100/;

# mongo鏈接
mongodb://mongo:27017/encore

# node容器可先設置環境變量,再動態獲取
'mongodb://www:123456@' + process.env.MONGO_SERVER + ':' + process.env.MONGO_PORT + '/encore'

在docker-compose.yml同目錄下,建立啓動/更新容器:

$ docker-compose up -d  # -d後臺運行

三、docker-compose經常使用命令

在docker-compose.yml同一目錄下
# 建立並啓動容器
$ docker-compose up -d

# 重啓容器
$ docker-compose restart

# 查看yml配置
$ docker-compose config

# 中止容器
$ docker-compose stop

# 中止並移除容器
$ docker-compose down

5、可視化容器管理工具

Portainer是一個輕量級的Docker環境UI界面管理系統

一、快速部署

$ docker volume create portainer_data # 在宿主機建立持久化目錄
$ docker run -d -p 9000:9000 --name portainer --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

二、相關配置

1.)交互模式

建立容器時,在高級設置裏,Console項記得勾選交互模式,不然沒法使用控制檯
  • [x] Interactive & TTY (-i -t)

2.)入口命令

在容器高級設置裏,command裏的shell命令必須單個加引號,如:
Command: 'pm2' 'start' './www.js' '--no-daemon'
Working Dir:  /app

3.)volume添加

portainer中volume默認在/var/lib/docker/volumes下,經過點擊bind按鈕修改/自定義對應的host路徑
相關文章
相關標籤/搜索