Backend - Docker 基础操作

目录

一、概念

(一)docker

1. 理解

2. 作用

(1)虚拟机隔离应用程序

(2)打包开发环境进行封装转移

(3)docker部署,不会像虚拟机会占用内存

(二)docker-compose

1. 理解

2. 作用

3. 使用

(三)Docker + Docker Compose

1. 容器管理

2. 原理

(四)Dockerfile

(五)image 镜像档

(六)容器+镜像+仓库

(七)Nginx + docker compose

1. Nginx 负载均衡

2. docker compose 后端部署

(八)Redis

二、docker 操作命令

 1. 查看docker、docker-compose版本

(1)查看docker版本

(2)查看docker-compose版本

 2. 查看docker镜像

 3. 查看容器

 4. 启动容器

 5. 重启容器

 6. 停止docker容器

 7. 进入容器

 8. 退出容器

 9. 查看docker文件內容

10. 查看容器的日志

11. 查看容器的启动日志

12. 移除容器

13. 启动mqtt

14. 查看虚拟环境的依赖

三、docker里启动项目

(一)操作步骤

1. 放项目代码

2. 拷贝镜像档

3. 启动镜像档(启动项目)

(二)镜像档的具体操作

1. 查看镜像档

2. 汇出镜像档 到 tar文件(拷贝镜像档image):

3. 汇入镜像档

4. 创建镜像档

(1)命令

(2)注意

5. 重新命名镜像档的名称、标签

6. 启动镜像档(启动项目)

(1)方式一:用操作docker-compose.yml的命令

(2)方式二:用直接针对某个image的命令

7. 执行sudo docker-compose up -d 遇到的问题

(1)问题:no configuration file provided: not found(或提示 Can't find a suitable configuration file in this directory or any

(2)问题:failed to solve: rms_api-api:latest: failed to do request: Head "https://registry-1.docker.io/v2/library/xxx/manifests/latest": dial tcp: lookup registry-1.docker.io on 127.0.0.53:53: server misbehaving。

(3)问题:XXXX/docker-compose.yml: yaml: line 2: did not find expected key

(4)问题:/docker-compose.yml: services.api Additional property images is not allowed

8. 执行 sudo docker exec -it [container_id] bash 遇到的问题

(1)问题:Error response from daemon: Container XXX is restarting, wait until the container is running.

(三)完整操作(本地代码放到docker上运行)

 1. 本地代码里保证有docker-compose.yml、Dockerfile、requirements.txt、manage.py(docker-compose.yml中的启动文件名也要对应写manage.py)

 2. 本地代码copy到WinSCP上

 3. putty软件的终端,都用sudo操作所有命令(拥有最高权限操作)

 4. 基本操作步骤:

 5. 若本地无法连接docker启动的环境

(1)docker里查看该容器日志,排查是否运行错误

(2)本地上的cmd终端里,测试IP和Port是否正常连接

四、创建数据库表格

1. WinSCP 设置数据库

2. putty 下指令

3. 问题

(1)could not connect to server:

(2)No changes detected

(3)python not fond


一、概念

(一)docker

1. 理解

        Docker相当于集装箱,可以打包应用、依赖等,包到一个容器中,通过容器就方便快速地部署到任何一台机器上,并且容器里的应用程序会运行在同一种环境下。

        即,方便在不同的环境下,能够运行同一个项目。(相当于提前打包一个虚拟环境)

        针对Ubantu上的Django项目,docker 就是虚拟环境,进入到docker就是进入到虚拟环境。

2. 作用

(1)虚拟机隔离应用程序

        比如,隔离.net开发的网站和php开发的网站

(2)打包开发环境进行封装转移

        比如,开发使用的Ubuntu,运维管理是centos。可以利用docker把开发环境直接封装好转移给运维,运维直接部署docker就可以了,而且部署速度快)

(3)docker部署,不会像虚拟机会占用内存

(二)docker-compose

1. 理解

        用于定义和运行多容器 Docker应用程序的工具。

        进行环境关系设定。(可以幕后处理一系列复杂的命令)

2. 作用

        启动docker里的多个image。

3. 使用

         docker -compose的使用需要 3 个步骤:

        (1)使用Dockerfile定义应用程序环境

        (2)在docker-compose.yml设定档中定义应用服务

        (3)运行docker-compose up以启动和运行应用程序

(三)Docker + Docker Compose

1. 容器管理

        docker 管理单个容器;

        docker-compose管理多个容器应用程序。

        当我们只想处理一个容器时使用 docker 或更具体地说是 docker 引擎,而当我们要处理多个容器时使用 docker-compose。

2. 原理

        Docker 是用于建立图像并将其作为容器运行的底层技术;

        Docker Compose 是一种工具,用于配置 Docker 应如何运行多个容器来为我们的应用程序提供服务。

(四)Dockerfile

        管理维护镜像档。

        基础环境搭建(部署项目的脚本,构建镜像的脚本)。

        通过docker build命令,根据Dockerfile的内容构建镜像。

(五)image 镜像档

        相当于一个打包好的、可以运行的电脑环境(镜像里有我们需要的软件代码和基础环境)。

        一个image代表一个环境。

        容器相当于实例,镜像相当于元件。一个镜像可生成多个容器。

(六)容器+镜像+仓库

        镜像是打包好的软件(环境);

        容器是镜像运行的实例;

        仓库是存放镜像的地方。

(七)Nginx + docker compose

1. Nginx 负载均衡

        前端直接在上面部署。

        在conf文件中(是Nginx的设定档,查看listen外部的端口号)。

2. docker compose 后端部署

        包括配置了listen port。

        启动docker。

        在yml文件汇总。

(八)Redis

Redis 键值数据库 key values (数据存入内存中 -- 挥发性内存)

二、docker 操作命令

 1. 查看docker、docker-compose版本

(1)查看docker版本

$ docker --version
# 或者
$ sudo docker -v

(2)查看docker-compose版本

$ sudo docker-compose -v

 2. 查看docker镜像

$ sudo docker images

其中,REPOSITORY:镜像的仓库源;TAG:镜像的标签版本号;IMAGE ID:镜像ID;CREATED:镜像创建时间;SIZE:镜像大小。

 3. 查看容器

(1)查看正在运行的docker容器

$ sudo docker ps ​​​​​​​

(2)查看运行的&停止的docker容器

        -a 显示本地docker仓库中的全部镜像

$ sudo docker ps -a

 4. 启动容器

# 第一种
$ sudo docker container start [containerID] 

# 第二种
$ sudo docker-compose up -d

 5. 重启容器

$ sudo docker restart  [container_id]

 6. 停止docker容器

# 第一种
$ sudo docker container stop [containerID]

# 第二种
$ sudo docker-compose down

 7. 进入容器

        其中,exec是进入容器,-it是以root身份进入

$ sudo docker exec -it [container_id] bash

 8. 退出容器

        在 # 后输入 exit 回车。或按下 Ctrl + D。

 9. 查看docker文件內容

$ sudo cat [Dockerfile]

10. 查看容器的日志

$ sudo docker container logs [containerID]

11. 查看容器的启动日志

$ docker logs --tail 50 --follow --timestamps [容器ID]

12. 移除容器

$ sudo docker rm [containerID]

13. 启动mqtt

$ bash mes.sh

14. 查看虚拟环境的依赖

$ pip list

注意:docker 就是虚拟环境,进入到docker就是进入到虚拟环境。

三、docker里启动项目

(一)操作步骤

1. 放项目代码

        包括项目源码、docker-compose.yml、dockerFile、以及一些镜像档。

2. 拷贝镜像档

        即先在原docker环境中拷贝所需镜像档文件(汇出镜像档),

        然后在新docker环境里挂载镜像档(汇入镜像档)。

3. 启动镜像档(启动项目)

        会产生相应的容器。

(二)镜像档的具体操作

1. 查看镜像档

sudo docker images

2. 汇出镜像档 到 tar文件(拷贝镜像档image):

① 操作镜像的形式

 sudo docker save [image_id] > [自定义文件名].tar

② 操作容器的形式

docker export [容器ID|Name] > [自定义文件名].tar

3. 汇入镜像档

① 操作镜像的形式

sudo docker load --input  [汇出的文件名].tar

② 操作容器的形式

sudo docker import [自定义文件名].tar [容器名]:[标签名]

4. 创建镜像档

如果没有镜像档,则用Dockerfile创建镜像档。

(1)命令
sudo docker build -t [自定义镜像档名] .
(2)注意

        ① Dockerfile文档必须在执行命令路径下。

        ② 命令最后有一个空格和一个点。

        ③ Dockerfile文档中有定义 install -r requirements.txt

5. 重新命名镜像档的名称、标签

如果汇入镜像档之后,发现 repository 和 tag 名称都为 none。

sudo docker tag [image_id] [镜像档名称]:[标签名]

6. 启动镜像档(启动项目)

(1)方式一:用操作docker-compose.yml的命令
sudo docker-compose up

     注意:

   ① 前提

        必须在docker-compose.yml所在目录下操作命令。

   ② 背景执行

        其中,up 和 up -d对比,后者的作用是及时关闭了putty命令行,程序依旧可以在后台运行。

sudo docker-compose up -d
(2)方式二:用直接针对某个image的命令

        其中,-p参数:若是-p 8000:3000 ,则表示容器的 3000 端口映射到本机的 8000 端口。

sudo docker run --name [自定义容器名] -p 80:80 -d [名字]

# 或
sudo docker run [镜像名]

# 或
sudo docker run -p 8010:8010 [镜像名]

7. 执行sudo docker-compose up -d 遇到的问题

(1)问题:no configuration file provided: not found(或提示 Can't find a suitable configuration file in this directory or any

parent. Are you in the right directory)

         原因:可能执行的位置不对。应该在有docker-compose.yml 文件的目录下执行命令。

(2)问题:failed to solve: rms_api-api:latest: failed to do request: Head "https://registry-1.docker.io/v2/library/xxx/manifests/latest": dial tcp: lookup registry-1.docker.io on 127.0.0.53:53: server misbehaving。

         原因:可能是docker-compose.yml文件中缺少image的设定内容。

(3)问题:XXXX/docker-compose.yml: yaml: line 2: did not find expected key

         原因:缩进的问题(缩进和缩排在docker-compose.yml文件中至关重要)

(4)问题:/docker-compose.yml: services.api Additional property images is not allowed

         原因:以下内容中,是image,而不是images。

version: '3'

services:
  api:
    image: [镜像名]:latest
    build: .
    restart: always
    command: python manage.py runserver 0.0.0.0:8010
    ports:
      - "8010:8010"
    volumes:
      - .:/app
      - /etc/timezone:/etc/timezone
      - /etc/localtime:/etc/localtime

8. 执行 sudo docker exec -it [container_id] bash 遇到的问题

(1)问题:Error response from daemon: Container XXX is restarting, wait until the container is running.

        原因:在启动容器时,虽然显示启动成功,但若项目代码有错也不会给提示,所以后期进入容器时一直提示在重启中。

        解决:输入查看容器启动日志的命令,以此来查看具体问题。

        命令:

 docker logs --tail 50 --follow --timestamps [容器ID]

        解释:容器日志一般会提示代码的出错位置。

        最后:修改好代码后,再重新关闭容器,启动容器。就可以正常进入容器了。

(三)完整操作(本地代码放到docker上运行)

 1. 本地代码里保证有docker-compose.yml、Dockerfile、requirements.txt、manage.py(docker-compose.yml中的启动文件名也要对应写manage.py)

 2. 本地代码copy到WinSCP上

 3. putty软件的终端,都用sudo操作所有命令(拥有最高权限操作)

 4. 基本操作步骤:

创建镜像:sudo docker build -t [自定义镜像档名] . (前提:Dockerfile 必须在执行命令路径下)

启动容器:sudo docker-compose up -d (前提:docker-compose.yml 必须在执行命令路径下;docker-compose.yml 文件的command对应是执行文档名,如manage.py)

查看日志(排查错误常用):sudo docker logs [containerID]

停止容器:sudo docker container stop [containerID]

移除容器:sudo docker rm [containerID]

移除镜像:sudo docker rmi [镜像档名]

 5. 若本地无法连接docker启动的环境

(1)docker里查看该容器日志,排查是否运行错误
(2)本地上的cmd终端里,测试IP和Port是否正常连接

首先测试IP:

ip  [ip]

然后是端口(查看端口是否正常启动起来):

telnet [ip] [port]

四、创建数据库表格

1. WinSCP 设置数据库

        在WinSCP的项目代码的settings.py文件里,设置数据库。(千万不要用成其它的数据库)

2. putty 下指令

        进入容器,生成迁移文件,执行数据库迁移,在PgAdmin中查看是否生成表格。

--- 查看容器名
$ sudo docker ps  
--- 进入容器
$ sudo docker exec -it [容器名] /bin/bash 
--- 前缀由$变成#,是因为从docker环境进入到容器内部
# python manage.py makemigrations 
# python manage.py migrate 
--- 或指定数据库 python manage.py migrate --database=[数据库名]
# exit

        实际操作如下图: 

3. 问题

(1)could not connect to server:

        Connection timed out Is the server running on host 

原因:

        可能是防火墙。

解决:

        用防火墙内部IP,而不是外部IP。

(2)No changes detected

原因:

        ① models文件的内容并没有任何变动。

        ② 在执行生成迁移文件命令时,未指明具体的APP。

解决:使用新的生成迁移文件命令。

        python ./manage.py makemigrations [app名]

(3)python not fond

原因:

        若执行迁移文件命令时,出现如下提示,则表明未在容器内操作。

解决:需要先进入容器,再下指令 python manage.py migrate。

           进入容器的命令:$ sudo docker exec -it [容器名] /bin/bash

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值