Docker 记录一些常用的Docker语法以及使用方法以便后续使用方便查看
Docker 语法
语法结构
1 | $ docker run ubuntu:15.10 /bin/echo "Hello world" |
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果。
参数 | 说明 |
---|---|
docker |
Docker 的二进制执行文件。 |
run |
与前面的 docker 组合来运行一个容器。 |
ubuntu:15.10 |
指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。 |
/bin/echo "Hello world" |
在启动的容器里执行的命令 |
删除镜像
删除指定镜像1
$ docker rmi --force `docker images | grep doss-api | awk '{print $3}'` //其中doss-api为关键字
删除所有镜像1
docker rmi `docker images -q`
停止所有容器
1 | docker stop $(docker ps -a -q) // stop停止所有容器 |
删除所有容器
1 | $ docker rm $(docker ps -a -q) // remove删除所有容器 |
交互式终端
1 | $ docker run -i -t imagename /bin/bash |
参数 | 说明 |
---|---|
-t |
在新容器内指定一个伪终端或终端。 |
-i |
允许你对容器内的标准输入 (STDIN) 进行交互。 |
-v |
挂载宿主机的指定目录 |
接下来就可以允许 ls 等命令了 退出 exit
停止镜像
1 | $ docker stop 容器ID |
进程运行(后台模式)
1 | $ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" |
循环打印hello world 每秒一次
命令 | 描述 |
---|---|
-d |
让容器在后台运行。 |
-P |
将容器内部使用的网络端口映射到我们使用的主机上。 |
-p |
-p 5000:5000 指定端口映射 |
docker ps |
打印容器状态 |
docker logs 容器id |
通过docker ps查到的id进行查询进程运行情况 |
docker stop 容器id |
容器id停止 |
Docker 镜像操作
Docker 常用的对镜像操作方法
常用命令
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像
语法 | 描述 |
---|---|
docker images |
打印本机所有镜像 |
docker search 名 |
查找镜像 |
docker pull ubuntu:13.10 |
下载镜像 |
创建镜像
当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 从已经创建的容器中更新镜像,并且提交这个镜像
- 使用 Dockerfile 指令来创建一个新的镜像
方法1 更新镜像
需要使用镜像来创建一个容器,比如
1 | $ docker run -t -i ubuntu:15.10 /bin/bash |
1 随意更新一下容器,比如在容器内执行
1 | $ apt-get update |
2 exit 退出
3 提交1
$ docker commit -m="has update" -a="runoob" id runoob/ubuntu:v2
参数 | 描述 |
---|---|
-m | 提交的描述信息 |
-a | 指定镜像作者 |
id号 | 容器ID 进入容器后root@后 |
runoob/ubuntu:v2 | 指定要创建的目标镜像名 |
4 验证是否提交成功
1 | $ docker images |
5 进入测试
1 | $ docker run -t -i runoob/ubuntu:v2 /bin/bash |
方法2 构建镜像 常用
创建目录并创建Dockerfile文件
1
2
3
4
5
6
7
8
9
10mkdir tes
cd tes
touch Dockerfile
cat Dockerfile
// 命令区别
touch:创建空白文档
mkdir:创建一个目录
vi:同touch一样,都是创建一个空白文档需要创建一个
Dockerfile
文件,告诉docker要什么东西1
2
3
4
5
6
7
8
9
10
11runoob@runoob:~$ cat Dockerfile
FROM centos:6.7
MAINTAINER Zok "362416272@qq.com"
RUN yum install -y httpd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D
FROM
指定使用哪个镜像源MAINTAINER
设置作者名与联系邮箱ENV
是环境变量设置,将/usr/local/bin:$PATH赋值给PATH,即增加/usr/local/bin这个环境变量路径。ADD
是将本地的代码放置到虚拟容器中。它有两个参数:第一个参数是.,代表本地当前路径;第二个参数是/code,代表虚拟容器中的路径,也就是将本地项目所有内容放置到虚拟容器的/code目录下,以便于在虚拟容器中运行代码WORKDIR
是指定工作目录,这里将刚才添加的代码路径设成工作路径。这个路径下的目录结构和当前本地目录结构是相同的,所以我们可以直接执行库安装命令、爬虫运行命令等。RUN
指令告诉docker 在镜像内执行命令,安装了什么。。。CMD
是容器启动命令。在容器运行时,此命令会被执行。在这里我们直接用scrapy crawl quotes来启动爬虫。EXPOSE
暴露端口然后,我们使用 Dockerfile 文件,通过
docker build
命令来构建一个镜像。
- 创建
-t 指定名称
1 | $ docker build -t runoob/centos:6.7 |
上传私有
打上tag标签1
$ docker tag quotes:latest wkunzhi/quotes:latest
上传1
$ docker push wkunzhi/quotes
案例 - 运行web程序
1 载入镜像
1 | $ docker pull training/webapp |
2 启动服务
1 | $ docker run -d -P training/webapp python app.py |
3 查看端口情况 docker ps
1 | $ docker ps |
根据端口访问 http://127.0.0.1:32768/ 测试
4 查看 WEB 应用程序日志
1 | $ docker logs -f 程序id |
命令 | 描述 |
---|---|
-f |
让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。 |
5 查看WEB应用程序容器的进程1
$ docker top 程序名或id
6 检查 WEB 应用程序(底层信息)1
$ docker inspect 程序名或id
7 停止 WEB 应用容器1
$ docker stop 程序名或id
8 重启WEB应用容器1
$ docker start 容器name(通过ps查到)
9 移除WEB应用容器1
$ docker rm 容器name(通过ps查到)
删除容器时,容器必须是停止状态,否则会报错
爬虫部署到Docker
1. 打包所需模块
在项目目录下创建一个 名为 requirements
的文件,文件内记录本项目用到的模块,如有特殊需求可设置模块版本号,例如:
1 | scrapy |
2. 创建Dockerfile文件
Dockerfile 文件用于设定Docker初始化
1 | $ touch Dockerfile |
Dockerfile 内容编辑1
2
3
4
5
6
7FROM python:3.7
MAINTAINER Zok "362416272@qq.com"
ENV PATH /usr/local/bin:$PATH
ADD . /code
WORKDIR /code
RUN pip3 install -r requirements
CMD scrapy crawl test
FROM
指定使用哪个镜像源MAINTAINER
设置作者名与联系邮箱ENV
是环境变量设置,将/usr/local/bin:$PATH赋值给PATH,即增加/usr/local/bin这个环境变量路径。ADD
是将本地的代码放置到虚拟容器中。它有两个参数:第一个参数是.,代表本地当前路径;第二个参数是/code,代表虚拟容器中的路径,也就是将本地项目所有内容放置到虚拟容器的/code目录下,以便于在虚拟容器中运行代码WORKDIR
是指定工作目录,这里将刚才添加的代码路径设成工作路径。这个路径下的目录结构和当前本地目录结构是相同的,所以我们可以直接执行库安装命令、爬虫运行命令等。RUN
指令告诉docker 在镜像内执行命令,安装了什么。。。CMD
是容器启动命令。在容器运行时,此命令会被执行。在这里我们直接用scrapy crawl test来启动爬虫。
3. 调整数据库连接地址
通常我们在测试的时候填写连接的本地数据库(这样在服务器docker上是访问不了的)需要填写公网或服务器内外访问数据库连接地址
4. 构建镜像
- 构建
1
$ docker build -t MySpider:latest .
命名格式: 仓库名:标签
检查 是否构建成功
1
$ docker images
运行测试
1
$ docker run 镜像名
5. 推送DockerHub
DockerHub 类似GitHub 你懂的, 没有账号需要注册一个 传送门
如果没有登陆,要先登陆docker1
$ docker login
必须要先设置镜像标签才能推送1
$ docker tag 本地的镜像名 注册用户名/自己起的hup镜像名
push到Hub上1
$ docker push 注册用户名/自己起的hup镜像名
完成后可以在网站上看到你推送的镜像了
6. 服务器运行镜像
进入服务器 [在安装了docker的情况下] 私有项目,服务器上也需要登陆docker
1 | $ docker run 注册用户名/自己起的hup镜像名 |
本地调试与修改镜像
vim下载安装
如果你用我上面的方法安装,是没有vim的需要额外安装
进入交互式镜像1
$ docker run -i -t 镜像名 /bin/bash
在项目同级目录运行1
2$ apt-get update
$ apt-get install vim
保存修改
!!要保存时,要另外打开一个终端!进行保存操作
1 获取镜像ID1
$ docker ps
2 提交保存1
$ docker commit 查到的id 提交命名:tag
Docker对接Github
绑定github会让你的项目在每次commit后,自动构建一个docker镜像,无需自己操作,神器!
- github创建项目
- 项目中需要有Dockerfile文件
- 创建docker项目 并 在dockerhub中关联,注意私有仓库免费版只有1个
- 设置自动构建
选择自动构建
总结: 论方便当然是git自动构建,但是本地构建可以构建好之后本地测试完毕后自主上传服务器,各有千秋,根据项目需求进行配置最佳