📓 Archive

DOCKER

FGJ: Create:2022/08/04 Update: [2024-12-16]

  • 使用样例 #

    1. 常用镜像 #

      # redis:6.2.7, redis:6.2.8
      # zookeeper:3.6.3, zookeeper:3.8.2[❌]
      # mysql:5.6.49, mysql:5.7.26
      
      # https://hub.docker.com/r/ealen/echo-server
      ealen/echo-server
      
      ➜  Desktop docker images
      REPOSITORY          TAG                  IMAGE ID            CREATED             SIZE
      python              3.10.12-alpine3.17   e64c3f105cd5        15 months ago       49.7MB
      redis               6.2.8                7c133222c17b        20 months ago       113MB
      busybox             1.34.1               beae173ccac6        2 years ago         1.24MB
      zookeeper           3.6.3                3e9dd32cd767        2 years ago         277MB
      ubuntu              20.04                ba6acccedd29        2 years ago         72.8MB
      mysql               5.6.49               4f36ba851740        3 years ago         302MB
      mysql               5.7.26               e9c354083de7        5 years ago         373MB
      

      三方镜像平台(多个防止丢失) #

      namesiteprefix
      aliyunhttps://cr.console.aliyun.com/cn-hangzhou/instance/dashboardregistry.cn-hangzhou.aliyuncs.com
      huaweihttps://console.huaweicloud.com/swr/?region=cn-north-4#/swr/dashboardswr.cn-north-4.myhuaweicloud.com
      163yunhttps://c.163yun.com/dashboard#/ccr/list
    2. 存储安装包 #

      • 简要说明 #

      将一些日常工作中用到的软件或者破解工具以及流程做个记录,利用公共仓库进行存储,使用的时候直接docker拉取镜像运行,然后挂载容器内文件到本地,直接进行安装。

      • 流程 #

        • a).构建Dockerfile #
          # Dockerfile
          FROM busybox
          LABEL maintainer xhsgg12302@126.com
          
          ENV DATADIR /target
          
          RUN mkdir -p $DATADIR
          
          ADD scrt_sfx-x64.8.5.4.1942.exe securecrtzcj.rar SecureCRT..........zip VanDyke-SecureCRT-and-SecureFX-Crack.7z  $DATADI
          # VOLUME ["/target"]
          
          COPY entrypoint.sh /
          COPY Dockerfile /
          
          ENTRYPOINT ["/entrypoint.sh"]
          
          CMD ["sh"]
          

          添加entrypoint.sh 是因为需要容器启动后执行移动相应文件到挂载目录的操作

          #!/bin/sh
          # vim:sw=4:ts=4:et
          # entrypoint.sh
          
          mkdir -p /data
          mv /target/* /data/
          
          # echo "$@"  ==>  sh
          exec "$@"
          
        • b).build镜像 #
          • $ docker build -f .\Dockerfile -t busybox-with-scrt:8.x [--network host .] .
          • $ docker build -f Dockerfile -t wechat-chatgpt-base:v1.0 --network host --build-arg "HTTP_PROXY=http://192.168.164.191:7890" --build-arg "HTTPS_PROXY=http://192.168.164.191:7890" .
          • $ docker run -it -e http_proxy=192.168.164.191:7890 -e https_proxy=192.168.164.191:7890 demo:v1.0
        • c).推送镜像 #
          $ docker login --username=5127*****@qq.com registry.cn-hangzhou.aliyuncs.com
          $ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/eli_w/busybox-with-scrt:[镜像版本号]
          $ docker push registry.cn-hangzhou.aliyuncs.com/eli_w/busybox-with-scrt:[镜像版本号]
          

          Caution

          如果推送成功在刷新网页看不到推送的镜像的话,有可能是地区选择有问题。

      • 移动容器文件到宿主机 #

        # 有entrypoint.sh加持
        $ docker run -v C:\Users\neddn\Desktop\package:/data --rm -it [imageId]
        
        # docker pull registry.cn-hangzhou.aliyuncs.com/eli_w/busybox-with-pdf-books:1.0.0
        $ docker run -v ~/Desktop/books:/data --rm --name books -[d]it 5f1c5a7b06e9
        $ mv books/* /data/
        
    3. 项目打包 #

      • 简要说明 #

        将原来的项目通过docker build 打包成一个镜像,如果需要查看API,或者说项目功能的话就不用直接打开IDEA查看了。

      • 方式1: (把依赖组件(redis,zk,mysql)编排,一次性构建) #

        • 基于依赖镜像构建,比如:

          # ---- Dependencies ----
          FROM node:12-alpine AS dependencies
          WORKDIR /app
          COPY package.json ./
          RUN yarn install
          
          # ---- Build ----
          FROM dependencies AS build
          WORKDIR /app
          COPY . /app
          RUN yarn build
          
          FROM nginx:1.16-alpine
          COPY --from=build /app/dist /usr/share/nginx/html
          EXPOSE 80
          CMD [ "nginx", "-g", "daemon off;" ]
          
        • 基于docker compose 进行编排

          • docker-compose.yml

            version: "3.7"
            services:
                app:
                    container_name: insuranceName
                    image: awesome/webapp
                    build: ./
                    ports:
                        - "9017:9017"
                    environment:
                        - TZ=Asia/Shanghai
                    networks:
                        - demo-net
                    depends_on:
                        - mysql
                        - redis
                        - zoo
            
                mysql:
                    hostname: mysql
                    image: mysql:5.7.26
                    # network_mode: "host" # 如果需要容器使用宿主机IP(内网IP),则可以配置此项
                    container_name: mysql # 指定容器名称,如果不设置此参数,则由系统自动生成
                    restart: always # 设置容器自启模式
                    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # 设置utf8字符集
                    environment:
                        - TZ=Asia/Shanghai # 设置容器时区与宿主机保持一致
                        - MYSQL_ROOT_PASSWORD=root # 设置root密码
                    # volumes:
                        # - /etc/localtime:/etc/localtime:ro # 设置容器时区与宿主机保持一致
                        # - ./mysql/data:/var/lib/mysql/data # 映射数据库保存目录到宿主机,防止数据丢失
                        # - ./mysql/my.cnf:/etc/mysql/my.cnf # 映射数据库配置文件
                    ports:
                        - "3306:3306"
                    privileged: true
                    networks:
                        demo-net:
                            aliases:
                                - mysql
            
                redis:
                    hostname: redis-compose
                    image: redis:6.2.7
                    container_name: redis-compose
                    restart: always
                    # command: redis-server /etc/redis.conf # 启动redis命令
                    environment:
                        - TZ=Asia/Shanghai
                    volumes:
                        # - /etc/localtime:/etc/localtime:ro # 设置容器时区与宿主机保持一致
                        - redis:/data
                        # - ./redis/redis.conf:/etc/redis.conf
                    ports:
                        - "6379:6379"
                    privileged: true
                    networks:
                        demo-net:
                            aliases:
                                - redis
            
                zoo:
                    image: zookeeper:3.6.3
                    restart: always
                    container_name: zoo-compose
                    ports:
                        - "2181:2181"
                    networks:
                        demo-net:
                            aliases:
                                - zookeeper
            
            volumes:
                redis:
            
            networks:
                demo-net: 
            
          • 基本命令

            # 指定文件在后台启动
            $ docker-compose -f docker-compose.yml up -d [--build/是否重新构建]           
            # 查看运行状态:
            $ docker-compose ps
            # 停止运行:
            $ docker-compose down # Stop and remove containers, networks, images, and volumes
            $ docker-compose stop # Stop services
            # 重启:
            $ docker-compose restart
            # 重启单个服务:
            $ docker-compose restart service-name
            # 进入容器命令行:
            $ docker-compose exec service-name sh
            # 查看容器运行log:
            $ docker-compose logs [service-name]
            
      • 方式2: (分开单独打包) #

        1. 创建docker网络

          # 创建网络
          $ docker network create demo-net
          
          # 查看docker网络信息
          $ docker network ls
          $ docker network inspect demo-net
          
          # 删除指定网络
          $ docker network rm demo-net
          
        2. 单独启动redis $ docker run -d -p 6379:6370 --name rds6379 --network demo-net [--network-alias redis] redis:6.2.7

        3. 单独启动zookeeper $ docker run -d -p 2181:2181 --name zk2181 --network demo-net [--network-alias zookeeper] zookeeper:3.6.3

        4. 使用centos加入网络环境ping检测网络环境是否正常 $ docker run -it --name test-centos --net demo-net centos

        5. 构建springboot镜像

          # 修改配置文件中主机名,包括Redis,MySQL,zookeeper等
          
          # 通过Dockerfile构建镜像
          $ docker build -f Dockerfile -t service:version . 
          
          # 可以push镜像到仓库,方便不同环境使用
          $ docker login --username=5127*****@qq.com registry.cn-hangzhou.aliyuncs.com
          $ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/eli_w/service:[镜像版本号]
          $ docker push registry.cn-hangzhou.aliyuncs.com/eli_w/service:[镜像版本号]
          
        6. 启动镜像启动镜像并检查是否正常 $ docker run -d -p 9017:9017 --name insurance-center --net demo-net insurance-center:5.0.1

    4. 数据卷容器(MYSQL) #

      • 简要说明 #

      将以往的mysql数据库中的数据目录datadir进行保存,制作成数据卷容器,方便保存及后续供mysql镜像挂载

      • 流程 #

        1. 获取 MySQL datadir目录中的数据

          第一种可以直接获取到存储数据的mysql${datadir}目录。
          第二种是根据文件进行导入的,如下:

          # offical site: https://hub.docker.com/_/mysql
          # 启动对应版本的mysql空实例
          docker run -d -p 3336:3336 -e MYSQL_ALLOW_EMPTY_PASSWORD=yes --name mysql-instance mysql:5.6.49 --datadir=/mysql-data/mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --port=3336
          # 链接实例,导入数据,生成数据目录
          # 从容器中导出数据
          docker cp d6b8e9a751e7:/mysql-data ./mysql-data
          
        2. 构建Dockerfile

          # Dockerfile
          FROM busybox:1.34.1
          LABEL maintainer = xhsgg12302@126.com
          ENV DATADIR /mysql-data/mysql
          RUN mkdir -p $DATADIR
          # 此处的mysql文件夹就是datadir指定的路径
          ADD mysql $DATADIR
          VOLUME $DATADIR
          COPY Dockerfile /
          CMD /bin/sh
          
        3. build 数据卷镜像 $ docker build -t mysql-data:1.0.0 -f Dockerfile .

          push到仓库

          $ docker login --username=5127*****@qq.com registry.cn-hangzhou.aliyuncs.com
          $ docker tag mysql-data:1.0.0 registry.cn-hangzhou.aliyuncs.com/eli_w/busybox-with-mysql-datadir:1.0.0
          $ docker push registry.cn-hangzhou.aliyuncs.com/eli_w/busybox-with-mysql-datadir:1.0.0
          
        4. 启动数据卷容器 $ docker run -dit --rm --name mysql-data mysql-data:1.0.0

        5. 挂载数据卷容器启动MySQL服务

          docker run -d -p 3336:3336  --name mysql-5.6.49 \
          # -v /my/custom:/etc/mysql/conf.d \
          # -e MYSQL_ROOT_PASSWORD=my-secret-pw \
          --volumes-from mysql-data  mysql:5.6.49 \
          --datadir=/mysql-data/mysql \
          --character-set-server=utf8mb4 \
          --collation-server=utf8mb4_unicode_ci \
          --port=3336
          
        6. 使用docker内部mysql客户端进行测试

          docker run -it --rm --network=host mysql:5.6.49 mysql -h 127.0.0.1 -u root -P 3336

      具体使用 #

    5. 搭建chatgpt #

      通过token调用openai或别的厂商的API的typescript的前端项目,并非部署模型直接生成。

      docker run -d --rm --name chatgpt -p 4000:3000 \
          -e OPENAI_API_KEY=hk-xwscww100000839098****** \
          -e BASE_URL=https://twapi.openai-hk.com \
          -e PROXY_URL=http://192.168.1.6:7890 \
          -e CODE=password \
          yidadaa/chatgpt-next-web
      

      reference #

安装 #

参考链接:
https://docs.docker.com/engine/install/ubuntu/
https://zhuanlan.zhihu.com/p/628536643
https://help.aliyun.com/document_detail/51853.html

# 卸载旧版
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

# Update the apt package index and install packages to allow apt to use a repository over HTTPS:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

# Add Docker’s official GPG key:
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Use the following command to set up the repository:
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Install Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

sudo systemctl start docker
sudo systemctl enable docker
# 运行以下命令,下载docker-ce的yum源。
sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 运行以下命令,安装Docker。
sudo yum -y install docker-ce

sudo docker -v
sudo systemctl start docker
sudo systemctl status docker
sudo systemctl enable docker
# https://developer.nvidia.com/blog/gpu-containers-runtime/
# https://github.com/NVIDIA/nvidia-container-runtime
# http://imyhq.com/cloud-native/41210.html

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt-get update
sudo apt-get install -y nvidia-docker2
# sudo pkill -SIGHUP dockerd
# sudo systemctl restart docker
sudo nvidia-container-cli --load-kmods info
sudo docker run -it --rm --runtime=nvidia nvidia/cuda:12.2.0-base-ubuntu20.04
nvidia-smi   # output

# 另外一种访问方式:(也可以使用nvidia-smi)
docker run --rm -it -e NVIDIA_VISIBLE_DEVICES=all --runtime nvidia ubuntu:20.04 /bin/bash
# 或者
docker run --rm -it --gpus=all --runtime nvidia ubuntu:20.04 /bin/bash

# docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

# 检查是否可以访问到硬件设备:(apt install pciutils)
# https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#verify-you-have-a-cuda-capable-gpu
lspci | grep -i nvidia 
# lsmod | grep nvidia 可以验证驱动是否安装。

# https://docs.nvidia.com/datacenter/tesla/tesla-installation-notes/index.html#ubuntu-lts
# apt-get install vim

# pip指定多个源:~/.pip/pip.conf
[global]
index-url=http://mirrors.aliyun.com/pypi/simple/
extra-index-url=https://pypi.tuna.tsinghua.edu.cn/simple/
                http://pypi.mirrors.ustc.edu.cn/simple/
                https://pypi.org/
[install]
trusted-host=mirrors.aliyun.com
             pypi.tuna.tsinghua.edu.cn
             pypi.mirrors.ustc.edu.cn
             pypi.org

# 运行stable-diffusion-ui
docker run -it --rm --gpus=all \
    -v ./miniconda3:/root/miniconda3 \
    -v /data/newbrush/ai/stable-diffusion-webui/models:/app/models \
    -v /data/newbrush/ai/stable-diffusion-webui/extensions:/app/extensions \
    -v /data/newbrush/ai/stable-diffusion-webui/github:/app/github \
    -v /data/newbrush/ai/stable-diffusion-webui/repositories:/app/repositories \
    -v ./venvs/sd/venv/:/app/venv \
    me/sd-ins:v1.1 /bin/bash

Reference #


comments powered by Disqus