docker - 学习笔记

2020-08-09  本文已影响0人  自走炮

安装

# 系统更新
$ sudo apt update
$ sudo apt upgrade
$ sudo apt autoremove

# 安装系统依赖包
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# 加入 Docker 信息库密钥
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
# key 确认
$ apt-key list
# 最后 8 位作为 fingerprint 参数
$ sudo apt-key fingerprint 0EBFCD88

# 将 Docker 信息库加入本地信息库当中
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
# 查看 OS 采用核心号
$ lsb_release -cs
# 查看信息库加入的位置和内容
$ cat /etc/apt/sources.list|grep docker

# 系统再更新
$ sudo apt update
$ sudo apt upgrade

# Docker 安装
$ apt show docker-ce
$ sudo apt install docker-ce docker-ce-cli containerd.io

# 校验安装
$ docker help
$ docker version
$ sudo docker run hello-world

node

# 电脑 1

# 建立 Git 库 -> https://github.com/komavideo
# 将 Git 库取得到本地
$ git clone https://github.com/komavideo/mynode
$ cd mynode

# 取得一个 node.js 8.16.1 LTS 的镜像
$ sudo docker image pull node:8.16.1
$ sudo docker image ls

# 编写一个 node.js 的应用
$ nano helo.js

console.log("I love this game.")

# 建立一个 node.js 的运行环境(container 容器)
$ nano Dockerfile

FROM node:8.16.1

RUN mkdir /src
COPY helo.js /src

CMD ["node", "/src/helo.js"]

# 编译打包我们的运行环境
$ sudo docker image build -t komavideo/mynode:v01 .
$ sudo docker image ls
# 在环境中运行我们的应用
$ sudo docker container run komavideo/mynode:v01

# Git 提交
$ git add .
$ git commit -m "mynode1"
$ git push
$ git tag v01
$ git tag
$ git push origin v01

# Docker Hub 云编译 -> https://hub.docker.com/
# Are you OK?

# 电脑 2

# 取得运行环境,运行应用
$ sudo docker image pull komavideo/mynode:latest
$ sudo docker container run komavideo/mynode:latest
$ sudo docker image pull komavideo/mynode:v01
$ sudo docker container run komavideo/mynode:v01

ENTRYPOINT 指定执行的进程

# 取得最新版的 node.js 镜像
$ sudo docker pull node:latest
# 启动容器,执行容器内命令
$ sudo docker container run node:latest ls /etc/
$ sudo docker container run node:latest cat /etc/hosts
$ sudo docker container run node:latest cat /etc/os-release
# 执行 node 进程,显示版本号
$ sudo docker image ls
$ sudo docker container run node:latest node -v

# 设置 node 为默认的进程,然后显示版本号
$ nano Dockerfile

FROM node:latest

ENTRYPOINT ["node"]

CMD [""]

$ sudo docker image build -t mynode:latest .
$ sudo docker image ls
$ sudo docker container run mynode:latest -v
$ sudo docker container run mynode:latest -help

# 使用 CMD 命令指定进程的默认参数
$ nano Dockerfile

FROM node:latest

ENTRYPOINT ["node"]

CMD ["-v"]

$ sudo docker image build -t mynode:latest .
# 显示版本号
$ sudo docker container run -it mynode:latest
# 显示帮助
$ sudo docker container run -it mynode:latest -help
# 评价执行 js 脚本
$ sudo docker container run -it mynode:latest -e "console.log('helo')"

nginx

# 找到您需要使用的镜像,并下载到本地
$ sudo docker pull nginx:1.17.5-alpine
$ sudo docker image ls
# 列出容器内目录
$ sudo docker container run nginx:1.17.5-alpine ls
# 确认容器核心版本
$ sudo docker container run nginx:1.17.5-alpine cat /etc/os-release
# 列出 nginx 设置目录
$ sudo docker container run nginx:1.17.5-alpine ls -R -l /etc/nginx
# 查看 nginx 全局设置文件
$ sudo docker container run nginx:1.17.5-alpine cat /etc/nginx/nginx.conf
# 查看默认 Web 虚拟主机设置文件
$ sudo docker container run nginx:1.17.5-alpine cat /etc/nginx/conf.d/default.conf
# 确认虚拟目录下面的内容
$ sudo docker container run nginx:1.17.5-alpine ls -R -l /usr/share/nginx/html
# 启动容器,确认效果
$ sudo docker container run --name myweb -d -p 8088:80 nginx:1.17.5-alpine
$ sudo docker container ls
# 服务动作确认
$ curl http://127.0.0.1:8088
# 停止容器服务
$ sudo docker container stop myweb
# 启动存在的容器
$ sudo docker container start myweb
# 列出所有容器
$ sudo docker container ls -a
# 删除指定容器
$ sudo docker container rm -f myweb
# 删除所有容器
$ sudo docker container prune

# 建立本地的Web目录和文件
$ mkdir myweb
$ cd myweb

$ nano index.html

<h1>Helo Docker world.</h1>

$ sudo docker container run --name myweb -d -p 8088:80 -v /home/lcadmin/myweb:/usr/share/nginx/html:ro nginx:1.17.5-alpine
# 服务动作确认
$ curl http://127.0.0.1:8088

python

# 找到您需要使用的 Python 镜像,并下载到本地
$ sudo docker pull python:3.8.0-alpine3.10
$ sudo docker image ls

# 进入 Python 交互终端
$ sudo docker container run --rm -it python:3.8.0-alpine3.10

> help()
> quit
> exit()

# Python 和 Pip 版本确认
$ sudo docker container run --rm -it python:3.8.0-alpine3.10 python -V
$ sudo docker container run --rm -it python:3.8.0-alpine3.10 pip -V
# Linux 版本确认
$ sudo docker container run --rm -it python:3.8.0-alpine3.10 cat /etc/os-release

# 执行本地的 Python 应用
$ nano main.py

import numpy as np
myarray = np.array([1,2,3,4,5])
print(myarray)

$ sudo docker container run --rm -it \
    -v /home/lcadmin/tmp:/workfolder:ro \
    python:3.8.0-alpine3.10 \
    python /workfolder/main.py

# 建立 Python 自己的镜像
$ nano Dockerfile
# alpine 为 musl libc 核心,虽然小巧,但一部分功能受限,下面的 numpy 安装时需要 UnixCCompiler 编译才可通过

# FROM python:3.8.0-alpine3.10
FROM python:3.8

RUN pip3 install numpy
RUN mkdir -p /workfolder
COPY ./main.py /workfolder/

CMD [ "python", "/workfolder/main.py" ]

# 建立 Python 应用镜像
$ sudo docker image build -t goodpython:v01 .
$ sudo docker image ls
# 容器应用程序运行
$ sudo docker container run --rm -it goodpython:v01

postgreSql

# 找到适合您的 PostgreSql 版本
$ sudo docker pull postgres:9.6.16-alpine
# 启动 PostgreSql 数据库服务器 - webdb
$ sudo docker run --name webdb -p 5432:5432 -e POSTGRES_USER=dbuser -e POSTGRES_PASSWORD=12345678 -d postgres:9.6.16-alpine
# 数据库容器(服务)查看
$ sudo docker container ls
$ nmap 127.0.0.1
# psql 连接
$ psql -h localhost -U dbuser

Password for user dbuser:
# dbuser=
> select * from pg_tables;
> \q

# 数据库服务停止
$ sudo docker stop webdb
$ nmap 127.0.0.1
$ sudo docker container ls
$ sudo docker container ls -a
# 数据库服务再开
$ sudo docker start webdb
# 进入数据库实例的bash
$ sudo docker exec -it webdb /bin/bash

# bash-5.0
> cd /var/lib/postgresql/data
> ls
> cat pg_hba.conf
> cat postgresql.conf
> exit

# 课题:数据库文件脱离 Docker 容器永久保存
# 建立专用的独立使用的卷(Volume)
$ sudo docker volume create --name v_webdb_data
$ sudo docker volume ls
$ sudo docker volume inspect v_webdb_data
# 清理旧的 webdb 实例
$ sudo docker stop webdb
$ sudo docker container rm webdb
$ sudo docker container ls -a
# 建立新的 webdb 实例
$ sudo docker run --name webdb -v v_webdb_data:/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_USER=dbuser -e POSTGRES_PASSWORD=12345678 -d postgres:9.6.16-alpine
# 绑定卷的查看
$ sudo docker inspect webdb

"Mounts": [
    {
        "Type": "volume",
        "Name": "v_webdb_data",
        "Source": "/var/lib/docker/volumes/v_webdb_data/_data",
        "Destination": "/var/lib/postgresql/data",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": ""
    }
],

pgadmin4 管理 postgreSql

# 安装
$ sudo docker pull dpage/pgadmin4:4.16
$ sudo docker image ls

# 启动数据库服务
$ sudo docker pull postgres:9.6.16-alpine
$ sudo docker volume create --name v_webdb_data
$ sudo docker run --name webdb -v v_webdb_data:/var/lib/postgresql/data -p 5432:5432 -e POSTGRES_USER=dbuser -e POSTGRES_PASSWORD=12345678 -d postgres:9.6.16-alpine

# 启动 pgadmin4 服务
$ sudo docker run --name pgadmin4 -p 8080:80 \
    -e 'PGADMIN_DEFAULT_EMAIL=admin@komavideo.com' \
    -e 'PGADMIN_DEFAULT_PASSWORD=12345678' \
    -d dpage/pgadmin4:4.16
$ sudo docker container ls

# 停止 Docker 容器
$ sudo docker stop pgadmin4
$ sudo docker start pgadmin4
$ sudo docker stop webdb
# 显示系统内容器
$ sudo docker container ls -a
# 显示运行中容器
$ sudo docker container ls

redis

# 安装
$ sudo docker pull redis:6.0.5-alpine
$ sudo docker image ls

# 建立 Redis 永久化卷标
$ sudo docker volume create --name v_redis_data
$ sudo docker volume ls
$ sudo docker run --name redis1 -v v_redis_data:/data -p 6379:6379 -d redis:6.0.5-alpine redis-server --appendonly yes --requirepass 12345678
$ sudo docker container ls

# 确认本地打开的 tcp 端口号
$ netstat -nltp
$ sudo docker exec -it redis1 top

# 启用客户端连接 redis1 服务
$ sudo apt install redis-tools
$ redis-cli -h 127.0.0.1 -p 6379 -a 12345678

# 127.0.0.1:6379
> ping
> info
> set data01 "helo, redis."
> get data01
> set data02 "komavideo"
> get data02
> keys *
> exit

docker compose

# 安装版本:https://github.com/docker/compose/releases
$ sudo curl -L https://github.com/docker/compose/releases/download/1.26.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ sudo docker-compose --version

# 卸载
$ sudo rm /usr/local/bin/docker-compose

flask

# main.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return '你好! 吃饭了吗?'

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True, port=5000)
# requirements.txt
flask==1.1.2

# Dockerfile
# 使用 python3.8 alpine 模板
FROM python:3.8.3-alpine3.12

# 将当前目录映射到容器内 /app 目录
ADD . /app
# 设置 /app 为工作目录
WORKDIR /app
# 安装 python 依赖包
RUN pip install -r requirements.txt

# 启动 flask 应用服务
CMD python main.py

# 打包 flask 服务镜像
$ sudo docker build -t komavideo/myweb:0.1 .
$ sudo docker image ls
$ sudo docker container run --name myweb -d -p 8088:5000 komavideo/myweb:0.1
$ sudo docker container ls
$ curl http://127.0.0.1:8088
# 删除不用的容器
$ sudo docker container prune

# docker-compose.yml
version: '3.8'
services:
  myweb:
    build: .
    ports:
    - "8088:5000"
    volumes:
    - .:/app

# 容器启动
$ sudo docker-compose up
# 容器重新编译后启动
$ sudo docker-compose up --build
# 容器启动(精灵线程)
$ sudo docker-compose up -d --build
# 查询容器状态
$ sudo docker-compose ps
# 执行 myweb 容器内的命令
$ sudo docker-compose run myweb top
# 查看容器输出日志
$ sudo docker-compose logs -f myweb
$ sudo docker logs -f work_myweb_1
# 容器停止
$ sudo docker-compose stop
# 容器停止,且消除(容器+网络)
$ sudo docker-compose down
# 容器停止,且消除(容器+网络+镜像)
$ sudo docker-compose down --rmi all

flask redis 多服务部署

# main.py
from flask import Flask
from redis import Redis

app = Flask(__name__)
redis = Redis(host='myredis', port=6379)

@app.route('/')
def hello():
    redis.incr('hits')
    return '你好! 我们见过 %s 次面。' % redis.get('hits')

if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True, port=5000)
# requirements.txt
flask==1.1.2
redis==3.5.3

# Dockerfile
# 使用 python3.8 alpine 模板
FROM python:3.8.3-alpine3.12

# 将当前目录映射到容器内 /app 目录
ADD . /app
# 设置 /app 为工作目录
WORKDIR /app
# 安装 python 依赖包
RUN pip install -r requirements.txt

# 启动 flask 应用服务
CMD python main.py

# docker-compose.yml
version: '3.8'
services:
  myweb:
    build: .
    ports:
    - "8088:5000"
    volumes:
    - .:/app
    depends_on:
    - myredis
  myredis:
    image: redis:6.0.5-alpine

# 容器启动
$ sudo docker-compose up
# 容器重新编译后启动
$ sudo docker-compose up --build
# 容器启动(精灵线程)
$ sudo docker-compose up -d --build
# 查询容器状态
$ sudo docker-compose ps
# 确认本地打开的 tcp 端口号
$ netstat -nltp
# Web 访问测试
$ curl http://127.0.0.1:8088
# 执行 myweb 容器内的命令
$ sudo docker-compose run myweb top
# 查看容器输出日志
$ sudo docker-compose logs -f
# 容器停止
$ sudo docker-compose stop
# 容器停止,且消除(容器+网络)
$ sudo docker-compose down
# 容器停止,且消除(容器+网络+镜像)
$ sudo docker-compose down --rmi all

vue

# Ubuntu 镜像取得
$ sudo docker pull node:12.18.1-buster
$ sudo docker image ls
$ mkdir src

# Dockerfile
FROM node:12.18.1-buster

ADD ./src /app
WORKDIR /app
ENV DEBCONF_NOWARNINGS yes
RUN apt-get update -y && \
    apt-get upgrade -y && \
    apt-get install -y \
        build-essential -y \
        curl \
        nmap \
        git \
        nano \
    && rm -rf /var/lib/apt/lists/*

RUN npm install -g @vue/cli@4.4.6

$ sudo docker image build -t koma/vuecli4:0.1 .
$ sudo docker image ls
$ sudo docker container run -it --name vuecli4 -v `pwd`/src:/app -p 8080:8080 -d koma/vuecli4:0.1
$ sudo docker container ls
$ sudo docker exec -it vuecli4 /bin/bash

# root@5e6a97287da5
> vue -V

> nano ~/.bashrc
export LS_OPTIONS='--color=auto'
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias l='ls $LS_OPTIONS -lA'

> nano ~/.vuerc
{
  "useTaobaoRegistry": false,
  "packageManager": "yarn"
}

> vue create myweb
> cd myweb
> npm run serve

$ curl http://192.168.x.x:8080 # 通过本地 8080 端口访问 vue 应用程序

react

$ cd work
$ mkdir app

$ nano Dockerfile

# Dockerfile
FROM node:12.18.2-alpine3.9

ADD ./app /app
WORKDIR /app

$ nano docker-compose.yml

# docker-compose.yml
version: '3.8'
services:
  node:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./app:/app
    command: sh -c "cd react-sample && yarn start"
    ports:
      - "3000:3000"
    stdin_open: true # 标准输入

# 编译前拉下 docker node 镜像
$ sudo docker pull node:12.18.2-alpine3.9
$ sudo docker image ls
# 编译容器服务
$ sudo docker-compose build
# 生成一个 React 应用程序
$ sudo docker-compose run --rm node sh -c "npm install -g create-react-app && create-react-app react-sample"
# 容器内确认生成的项目
$ sudo docker-compose run node ls
# 确认本地文件夹的app目录
$ ls ./app
# 启动容器
$ sudo docker-compose up
# 浏览器访问 http://localhost:3000

$ nano app/react-sample/src/App.js
上一篇 下一篇

猜你喜欢

热点阅读