- 安装
- node
- ENTRYPOINT 指定执行的进程
- nginx
- python
- postgreSql
- pgadmin4 管理 postgreSql
- redis
- docker compose
- flask
- flask redis 多服务部署
- vue
- react
安装
# 系统更新
$ 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
- 主流程
- 建立 Docker Image
- 编写应用程序
- 上推 GitHub
- DockerHub 云编译打包
- 下载使用 Docker Image
# 电脑 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 多服务部署
- 服务结构 client <-> web(flask:myweb) <-> db(redis:myredis)
# 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
网友评论