美文网首页
docker - 学习笔记

docker - 学习笔记

作者: 自走炮 | 来源:发表于2020-08-09 02:48 被阅读0次
    • 安装
    • 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
    

    相关文章

      网友评论

          本文标题:docker - 学习笔记

          本文链接:https://www.haomeiwen.com/subject/pdjgrktx.html