docker & docker-compose 入門

1、docker

一、why docker ?

image.png

二、repository、image、container、tag

image.png

三、how to use ?

1) command

# 以守護進程模式啓動Docker
sudo service docker start

# 設置開機自動啓動Docker
systemctl start docker

# 查看版本
docker version
# 拉取鏡像 
docker pull name:tag
docker pull nginx
docker pull busybox
docker pull python:2.7

# 查看鏡像
docker images

# 刪除鏡像
docker rmi id

# 查看容器 運行中
docker ps

docker ps -a 

# 查看網絡 (namespace,veth pair)
docker network ls
{ bridge, host, none, overlay}
# docker run 啓動容器
-d 後臺運行
--name 指定容器名稱
-p 80:80 端口映射
-v /root:/root 目錄映射
--link 連接容器
--nwtwork 指定網絡
-c 添加運行時cmd 命令
-e 添加環境變量
 
# docker exec name -it 
-it    交互模式進入容器
-i --interactive
-t --tty

2) example

-- 啓動nginx容器
docker run -it --name web-n1 -p 80:80 -v /var/www/html:/usr/share/nginx/html -d nginx:alpine

image-20200913233850606

-- 啓動redis
docker run -d --name rds -p 6379:6379 redis
-- 連接容器
docker run -d --link rds --name app-1 -e REDIS_HOST=rds app:1.0

3) dockerfile

dokcerfile構建:
FROM  : 來源基礎鏡像 (scratch -> 全部鏡像原始鏡像)
MAINTAINER :  做者<郵箱>
RUN : 容器構建須要執行的命令 (建立用戶組 , 建立文件夾 , 安裝包 等)
RUN yum -y install vim 
RUN yum -y install net-tools
RUN mkdir /var/wwwroot 
建議以下使用 , 使用 & 鏈接 : 
RUN yum -y install vim \
&& yum -y install net-tools \
&& mkdir /var/wwwroot 

EXPOSE : 暴露的端口號
WORKDIR : 指定在建立而且進去容器終端後的工做目錄(無指定到 / 根目錄)
ENV : 構建鏡像過程當中設置的環境變量 
ENV MY_PATH /var/wwwroot
WORKDIR $MY_PATH

ADD : 將宿主機目錄下的文件拷貝進鏡像 , 而且會自動處理url和解壓tar壓縮包
COPY : 相似add , 拷貝到鏡像, 沒有處理功能
VALUME : 容器數據卷, 用於數據持久化 , 容器中建立指定的目錄
CMD : 指定容器啓動時運行的命令 ( 多個命令只有最後一個生效 , 會被docker run以後的參數覆蓋)
ENTRYPOINT : 與cmd功能同樣 , 會在docker run以後的參數追加命令
ONBUILD : 當構建一個被繼承的dockerfile時運行命令,父鏡像在被子鏡像繼承後父鏡像的onbuild被觸發
FROM python:3.7

COPY . /var/www/app
WORKDIR /var/www/app
RUN pip install flask redis
EXPOSE 80
CMD [ "python","app.py" ]
from flask import Flask
from redis import Redis
import os
import socket

app = Flask(__name__)

redis = Redis(host=os.environ.get('REDIS_HOST','127.0.0.1'),prot=6379)

@app.route("/")
def incr():
  redis.incr('like')
  return 'current like = %s, current host = %s \n' % (redis.get('like'),socket.gethostname())

if __name__ == "__main__":
  app.run(host="0.0.0.0",port=80,debug=True)
# 使用dockerfile構建鏡像
docker build -t name:tag -f template .
docker build -t app-1:1.0 .

# 運行構建鏡像
docker run -d --link rds-1 --name app-5 -p 80:80 -e REDIS_HOST=rds-1 app-1:3.0

# 進入容器
docker exec -it app-5 bash
curl 0.0.0.0:80
--> current like = b'1', current host = bc33562a73ea
--> current like = b'2', current host = bc33562a73ea
--> current like = b'3', current host = bc33562a73ea

4) cluster example

etcd + dockerhtml

overlay networkpython

/usr/bin/dockerd -H tcp://0.0.0.02375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.xxx.xx:2379 --cluster-advertise=192.168.xxx.xx1:2375&

/usr/bin/dockerd -H tcp://0.0.0.02375 -H unix:///var/run/docker.sock --cluster-store=etcd://192.168.xxx.xx:2379 --cluster-advertise=192.168.xxx.xx2:2375&

四、docker-compose

1) docker-compose.yml

version: "3"

services: 
  rds:
    image: redis
  app:
    build: 
      context: .
      dockerfile: Dockerfile
      ports: 
        - 80:80
        environment: 
          REDIS_HOST: rds

2) scale、load balance

--scalelinux

docker-compose up --scale app=3 -dnginx

version: '3'

services:
  rds:
    image: redis

  app:
    build:
      context: .
      dockerfile: Dockerfile
    # ports:
    # - 80:80
    environment:
      REDIS_HOST: rds

  lib:
    image: dockercloud/haproxy
    links:
      - app
    ports:
      - 80:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

3) command

cd ~/path
docker-compose up -d
docker-compose stop
docker-compose restart
docker-compose down
docker-compose build

4) cluster

k8s, swarm
相關文章
相關標籤/搜索