目录
(1)方式一:用操作docker-compose.yml的命令
7. 执行sudo docker-compose up -d 遇到的问题
(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.
3. putty软件的终端,都用sudo操作所有命令(拥有最高权限操作)
(1)could not connect to server:
一、概念
(一)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