Docker简介
基于菜鸟教程自己亲自实践一遍,把教程中有误的步骤改正过来,方便自己后期查看使用
Docker 介绍
- Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
- Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
- 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
- Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
Docker 的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
Docker 的优点
- 简化程序
Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。方便快捷已经是 Docker的最大优势,过去需要用数天乃至数周的 任务,在Docker容器的处理下,只需要数秒就能完成。 - 避免选择恐惧症
如果你有选择恐惧症,还是资深患者。那么你可以使用 Docker 打包你的纠结!比如 Docker 镜像;Docker 镜像中包含了运行环境和配置,所以 Docker 可以简化部署多种应用实例工作。比如 Web 应用、后台应用、数据库应用、大数据应用比如 Hadoop 集群、消息队列等等都可以打包成一个镜像部署。 - 节省开支
一方面,云计算时代到来,使开发者不必为了追求效果而配置高额的硬件,Docker 改变了高性能必然高价格的思维定势。Docker 与云的结合,让云空间得到更充分的利用。不仅解决了硬件管理的问题,也改变了虚拟化的方式。
Docker 架构
- Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
- Docker 容器通过 Docker 镜像来创建。
- 容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板。 |
---|---|
Docker 容器(Container) | 容器是独立运行的一个或一组应用。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker 仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
Docker 安装
Ubuntu Docker 安装
Docker 支持以下的 Ubuntu 版本:
- Ubuntu Precise 12.04 (LTS)
- Ubuntu Trusty 14.04 (LTS)
- Ubuntu Wily 15.10
- Xenial 16.04 (LTS)
- 其他更新的版本……
如果安装 Docker ce 需要 16.04 及以上版本,安装步骤可以查看笔记部分:
- Cosmic 18.10
- Bionic 18.04 (LTS)
- Xenial 16.04 (LTS)
前提条件
Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker。
通过 uname -r 命令查看你当前的内核版本:
1 | $ uname -r |
使用脚本安装 Docker
- 获取最新版本的 Docker 安装包
1
$ wget -qO- https://get.docker.com/ | sh
输入当前用户的密码后,就会下载脚本并且安装Docker及依赖包。
安装完成后有个提示:
1 | If you would like to use Docker as a non-root user, you should now consider |
当要以非root用户可以直接运行docker时,需要执行 sudo usermod -aG docker runoob 命令,然后重新登陆,否则会有如下报错:
- 启动docker 后台服务
1 | $ sudo service docker start |
- 测试运行hello-world
1 | $ docker run hello-world |
镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。
请在该配置文件中加入(没有该文件的话,请先建一个):
1 | { |
Ubuntu 16.04 安装 Docker
1.选择国内的云服务商,这里选择阿里云为例
1 | curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh - |
2.安装所需要的包
1 | sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual |
3.添加使用 HTTPS 传输的软件包以及 CA 证书
1 | sudo apt-get update |
4.添加GPG密钥
1 | sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D |
5.添加软件源
1 | echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list |
6.添加成功后更新软件包缓存
1 | sudo apt-get update |
7.安装docker
1 | sudo apt-get install docker-engine |
8.启动 docker
1 | sudo systemctl enable docker |
Ubuntu 18.04 安装 Docker-ce
1.更换国内软件源,推荐中国科技大学的源,稳定速度快(可选)
1 | sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak |
2.安装需要的包
1 | sudo apt install apt-transport-https ca-certificates software-properties-common curl |
3.添加 GPG 密钥,并添加 Docker-ce 软件源,这里还是以中国科技大学的 Docker-ce 源为例
1 | curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add - |
4.添加成功后更新软件包缓存
1 | sudo apt update |
5.安装 Docker-ce
1 | sudo apt install docker-ce |
6.设置开机自启动并启动 Docker-ce(安装成功后默认已设置并启动,可忽略)
1 | sudo systemctl enable docker |
7.测试运行
1 | sudo docker run hello-world |
8.添加当前用户到 docker 用户组,可以不用 sudo 运行 docker(可选)
1 | sudo groupadd docker |
9.测试添加用户组(可选)
1 | docker run hello-world |
CentOS Docker 安装
Docker支持以下的CentOS版本:
- CentOS 7 (64-bit)
- CentOS 6.5 (64-bit) 或更高的版本
前提条件
目前,CentOS 仅发行版本中的内核支持 Docker。
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
使用 yum 安装(CentOS 7下)
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本
1 | # uname -r |
从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。
Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。
本文介绍 Docker CE 的安装使用。
移除旧的版本:
1 | $ sudo yum remove docker \ |
安装一些必要的系统工具:
1 | sudo yum install -y yum-utils device-mapper-persistent-data lvm2 |
添加软件源信息:
1 | sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
Docker支持以下的CentOS版本:
CentOS 7 (64-bit)
CentOS 6.5 (64-bit) 或更高的版本
前提条件
目前,CentOS 仅发行版本中的内核支持 Docker。
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
使用 yum 安装(CentOS 7下)
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。
通过 uname -r 命令查看你当前的内核版本
[root@runoob ~]# uname -r
安装 Docker
从 2017 年 3 月开始 docker 在原来的基础上分为两个分支版本: Docker CE 和 Docker EE。
Docker CE 即社区免费版,Docker EE 即企业版,强调安全,但需付费使用。
本文介绍 Docker CE 的安装使用。
移除旧的版本:
1 | # yum remove docker \ |
安装一些必要的系统工具:
1 | # yum install -y yum-utils device-mapper-persistent-data lvm2 |
添加软件源信息:
1 | # yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
更新 yum 缓存:
1 | # yum makecache fast |
安装 Docker-ce:
1 | # yum -y install docker-ce |
启动 Docker 后台服务:
1 | # systemctl start docker.service |
测试运行 hello-world
1 | # docker run hello-world |
由于本地没有hello-world这个镜像,所以会下载一个hello-world的镜像,并在容器内运行。
使用脚本安装 Docker
- 使用 sudo 或 root 权限登录 Centos。
确保 yum 包更新到最新。
1
# yum update
执行 Docker 安装脚本。
1
2# curl -fsSL https://get.docker.com -o get-docker.sh
# sh get-docker.sh
执行这个脚本会添加 docker.repo 源并安装 Docker。
启动 Docker 进程。
1
# systemctl start docker.service
验证 docker 是否安装成功并在容器中执行一个测试的镜像。
1
2# docker run hello-world
# docker ps
到此,Docker 在 CentOS 系统的安装完成。
镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。
请在该配置文件中加入(没有该文件的话,请先建一个):
1 | { |
删除 Docker CE
执行以下命令来删除 Docker CE:
1 | # yum remove docker-ce |
Windows Docker 安装
win7、win8 系统
win7、win8 等需要利用 docker toolbox 来安装,国内可以使用阿里云的镜像来下载,下载地址:http://mirrors.aliyun.com/docker-toolbox/windows/docker-toolbox/
docker toolbox 是一个工具集,它主要包含以下一些内容:
Docker CLI 客户端,用来运行docker引擎创建镜像和容器
Docker Machine. 可以让你在windows的命令行中运行docker引擎命令
Docker Compose. 用来运行docker-compose命令
Kitematic. 这是Docker的GUI版本
Docker QuickStart shell. 这是一个已经配置好Docker的命令行环境
Oracle VM Virtualbox. 虚拟机
下载完成之后直接点击安装,安装成功后,桌边会出现三个图标,入下图所示:
如果系统显示 User Account Control 窗口来运行 VirtualBox 修改你的电脑,选择 Yes。
$ 符号那你可以输入以下命令来执行
1 | $ docker run hello-world |
Win10 系统
现在 Docker 有专门的 Win10 专业版系统的安装包,需要开启Hyper-V。
应用和功能 -> 程序和功能 -> 启用或关闭Windows功能 -> 选中Hyper-V
- 安装 Toolbox
最新版 Toolbox 下载地址: https://www.docker.com/get-docker
点击 Download Desktop and Take a Tutorial,并下载 Windows 的版本,如果你还没有登录,会要求注册登录:
- 运行安装文件
双击下载的 Docker for Windows Installer 安装文件,一路 Next,点击 Finish 完成安装。
安装完成后,Docker 会自动启动。通知栏上会出现个小鲸鱼的图标,这表示 Docker 正在运行。
桌边也会出现三个图标,我们可以在命令行执行 docker version 来查看版本号,docker run hello-world 来载入测试镜像测试。
如果没启动,你可以在 Windows 搜索 Docker 来启动,启动后,也可以在通知栏上看到小鲸鱼图标
镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。
请在该配置文件中加入(没有该文件的话,请先建一个):
1 | { |
MacOS Docker 安装
使用 Homebrew 安装
macOS 我们可以使用 Homebrew 来安装 Docker。
Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:
1 | $ brew cask install docker |
在载入 Docker app 后,点击 Next,可能会询问你的 macOS 登陆密码,你输入即可。之后会弹出一个 Docker 运行的提示窗口,状态栏上也有有个小鲸鱼的图标。
手动下载安装
如果需要手动下载,请点击以下链接下载 Stable 或 Edge 版本的 Docker for Mac。
如同 macOS 其它软件一样,安装也非常简单,双击下载的 .dmg 文件,然后将鲸鱼图标拖拽到 Application 文件夹即可。
从应用中找到 Docker 图标并点击运行。可能会询问 macOS 的登陆密码,输入即可。
点击顶部状态栏中的鲸鱼图标会弹出操作菜单。
第一次点击图标,可能会看到这个安装成功的界面,点击 “Got it!” 可以关闭这个窗口。
启动终端后,通过命令可以检查安装后的 Docker 版本。
1 | $ docker --version |
镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。
在任务栏点击 Docker for mac 应用图标 -> Perferences… -> Daemon -> Registry mirrors。在列表中填写加速器地址即可。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应用配置的镜像地址了。
之后我们可以通过 docker info 来查看是否配置成功。
1 | $ docker info |
Docker 使用
Docker Hello World
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序。
输出Hello world
1 | # docker run centos /bin/echo "Hello world" |
各个参数解析:
- docker: Docker 的二进制执行文件。
- run: 与前面的 docker 组合来运行一个容器。
- ceentos 指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
- /bin/echo “Hello world”: 在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 centos 镜像创建一个新容器,然后在容器里执行 bin/echo “Hello world”,然后输出结果。
搜索docker hub中的镜像
1 | # docker search centos |
运行交互式的容器
我们通过docker的两个参数 -i -t,让docker运行的容器实现”对话”的能力
1 | [root@localhost ~]# docker run -i -t centos /bin/bash |
各个参数解析:
- -t:在新容器内指定一个伪终端或终端。
- -i:允许你对容器内的标准输入 (STDIN) 进行交互。
我们可以通过运行exit命令或者使用CTRL+D来退出容器。
启动容器 (后台模式)
使用以下命令创建一个以进程方式运行的容器:
1 | [root@localhost ~]# docker run -d centos /bin/sh -c "while true; do echo hello world; sleep 1; done" |
在输出中,我们没有看到期望的”hello world”,而是一串长字符,这个长字符串叫做容器ID,对每个容器来说都是唯一的,我们可以通过容器ID来查看对应的容器发生了什么。
首先,我们需要确认容器有在运行,可以通过 docker ps 来查看
1 | [root@localhost ~]# docker ps |
CONTAINER ID:容器ID
NAMES:自动分配的容器名称
在容器内使用docker logs命令,查看容器内的标准输出:
1 | // 如下两个命令的输出结果一致,都是好多个hello world |
停止容器
我们使用 docker stop 命令来停止容器:
1 | # docker stop 7e436b869135 |
通过docker ps查看,容器已经停止工作:
1 | # docker ps |
也可以用下面的命令来停止:
1 | # docker stop competent_merkle |
Docker 容器使用
Docker 客户端
直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。
可以通过命令 docker command –help 更深入的了解指定的 Docker 命令使用方法。
例如我们要查看 docker stats 指令的具体使用方法:
1 | [root@localhost ~]# docker stats --help |
运行一个web应用
在docker容器中运行一个 Python Flask 应用来运行一个web应用。
1 | [root@localhost ~]# docker pull training/webapp # 载入镜像 |
参数说明:
- -d:让容器在后台运行。
- -P:将容器内部使用的网络端口映射到我们使用的主机上。
查看 WEB 应用容器
使用 docker ps 来查看我们正在运行的容器:
1 | [root@localhost ~]# docker ps |
这里多了端口信息。
1 | PORTS |
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768 上。
这时我们可以通过浏览器访问WEB应用:http://192.168.0.130:32768
也可以通过 -p 参数来设置不一样的端口:
1 | [root@localhost ~]# docker run -d -p 5000:5000 training/webapp python app.py |
docker ps查看正在运行的容器
1 | [root@localhost ~]# docker ps |
容器内部的 5000 端口映射到我们本地主机的 5000 端口上。
网络端口的快捷方式
通过 docker ps 命令可以查看到容器的端口映射,docker 还提供了另一个快捷方式 docker port,
使用 docker port 可以查看指定 (ID 或者名字)容器的某个确定端口映射到宿主机的端口号。
上面我们创建的 web 应用容器 ID 为 e18b3ff3ed87 名字为 nervous_chandrasekhar。
我可以使用 docker port e18b3ff3ed87 或 docker port nervous_chandrasekhar 来查看容器端口的映射情况。
1 | [root@localhost ~]# docker port e18b3ff3ed87 |
查看 WEB 应用程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出。
1 | [root@localhost ~]# docker logs -f e18b3ff3ed87 |
-f:让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
从上面,我们可以看到应用程序使用的是 5000 端口并且能够查看到应用程序的访问日志。
查看WEB应用程序容器的进程
还可以使用 docker top 来查看容器内部运行的进程
1 | [root@localhost ~]# docker top e18b3ff3ed87 |
检查 WEB 应用程序
使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
1 | [root@localhost ~]# docker inspect e18b3ff3ed87 |
停止 WEB 应用容器
1 | [root@localhost ~]# docker stop e18b3ff3ed87 |
重启WEB应用容器
1 | [root@localhost ~]# docker start e18b3ff3ed87 |
docker ps -l 查询最后一次创建的容器:
1 | [root@localhost ~]# docker ps -l |
正在运行的容器,我们可以使用 docker restart 命令来重启
移除WEB应用容器
使用 docker rm 命令来删除不需要的容器:
1 | [root@localhost ~]# docker rm e18b3ff3ed87 |
删除容器时,容器必须是停止状态,否则会报如下错误:
1 | [root@localhost ~]# docker rm ab3dc2ea8033 |
批量删除所有容器
1 | [root@localhost ~]# docker rm `docker ps -a -q` |
Docker 镜像使用
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。
下面我们来学习:
- 管理和使用本地 Docker 主机镜像
- 创建镜像
列出镜像列表
可以使用 docker images 来列出本地主机上的镜像。
1 | [root@localhost ~]# docker images |
各个选项说明:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
同一仓库源可以有多个 TAG,代表这个仓库源的不同版本,如ubuntu仓库源里,有15.10、14.04等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。
所以,我们如果要使用版本为15.10的ubuntu系统镜像来运行容器时,命令如下:
1 | [root@localhost ~]# docker run -t -i ubuntu:15.10 /bin/bash |
如果要使用版本为14.04的ubuntu系统镜像来运行容器时,命令如下:
1 | [root@localhost ~]# docker run -t -i ubuntu:14.04 /bin/bash |
如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
获取一个新的镜像
当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它。
1 | [root@localhost ~]# docker pull ubuntu:14.04 |
下载完成后,我们可以直接使用这个镜像来运行容器。
查找镜像
可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
也可以使用 docker search 命令来搜索镜像。比如我们需要一个nginx的镜像来作为我们的web服务。我们可以通过 docker search 命令搜索 nginx 来寻找适合我们的镜像。
1 | [root@localhost ~]# docker search nginx |
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否docker官方发布
拖取镜像
使用上图中的nginx官方版本的镜像,使用命令 docker pull 来下载镜像。
1 | [root@localhost ~]# docker pull nginx |
下载完成后,我们就可以使用这个镜像了。
1 | [root@localhost ~]# docker run nginx |
创建镜像
当从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
- 从已经创建的容器中更新镜像,并且提交这个镜像
- 使用 Dockerfile 指令来创建一个新的镜像
更新镜像
更新镜像之前,需要使用镜像来创建一个容器。
1 | [root@localhost ~]# docker run -t -i ubuntu:15.10 /bin/bash |
在运行的容器内使用 apt-get update 命令进行更新。在完成操作之后,输入 exit命令来退出这个容器。
此时ID为387f1a8b1d86的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit来提交容器副本。
1 | [root@localhost ~]# docker commit -m="update" -a="sandu" 387f1a8b1d86 sandu/ubuntu:v2 |
各个参数说明:
- -m:提交的描述信息
- -a:指定镜像作者
- 387f1a8b1d86:容器ID
- sandu/ubuntu:v2:指定要创建的目标镜像名
- v2:表示的是TAG
然后可以使用 docker images 命令来查看我们的新镜像 sandu/ubuntu:v2:
1 | [root@localhost ~]# docker images |
使用我们的新镜像 sandu/ubuntu来启动一个容器
1 | [root@localhost ~]# docker run -t -i sandu/ubuntu:v2 /bin/bash |
构建镜像
使用命令 docker build , 从零开始来创建一个新的镜像。首先需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
注意:这里使用一个使用flask框架的后台模板,GitHub地址
1 | [root@localhost ~]# cat Dockerfile |
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么
然后使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
1 | [root@localhost flask-gentelella-master]# docker build -t sandu/python:3.6 . |
参数说明:
- -t :指定要创建的目标镜像名
- . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
使用docker images 查看创建的镜像已经在列表中存在,镜像ID为3fc000939e8e
1 | [root@localhost ~]# docker images |
可以使用新的镜像来创建容器
1 | [root@localhost ~]# docker run -d -p 5000:5000 --name gentelella --restart always sandu/python:3.6 |
设置镜像标签
可以使用 docker tag 命令,为镜像添加一个新的标签。
docker tag 镜像ID,这里是 3fc000939e8e ,用户名称、镜像源名(repository name)和新的标签名(tag)。
使用 docker images 命令可以看到,ID为3fc000939e8e的镜像多一个pro标签。
1 | [root@localhost ~]# docker images |
删除镜像
- 查看本地docker镜像
1
2
3
4
5
6
7
8
9
10
11
12[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sandu/python 3.6 3fc000939e8e 2 hours ago 1.05GB
sandu/python pro 3fc000939e8e 2 hours ago 1.05GB
sandu/ubuntu v2 02c1ed8e875c 3 hours ago 137MB
python 3.6 f93001dcf9ed 11 hours ago 924MB
nginx latest f68d6e55e065 10 days ago 109MB
ubuntu 14.04 2c5e00d77a67 8 weeks ago 188MB
centos latest 9f38484d220f 3 months ago 202MB
hello-world latest fce289e99eb9 6 months ago 1.84kB
ubuntu 15.10 9b9cb95443b5 2 years ago 137MB
training/webapp latest 6fae60ef3446 4 years ago 349MB
- 查看本地docker镜像
尝试删除本地镜像,发现无法直接删除镜像
1
2[root@localhost ~]# docker rmi training/webapp
Error response from daemon: conflict: unable to remove repository reference "training/webapp" (must force) - container ab3dc2ea8033 is using its referenced image 6fae60ef3446原因分析: 有关联docker容器,无法删除
1
2# 查看镜像和容器的关联信息
[root@localhost ~]# docker ps -a删除docker容器
1
2
3
4# 先停止容器,然后再删除
[root@localhost ~]# docker stop ab3dc2ea8033
[root@localhost ~]# docker rm ab3dc2ea8033
ab3dc2ea8033删除docker镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[root@localhost ~]# docker rmi training/webapp
Untagged: training/webapp:latest
Untagged: training/webapp@sha256:06e9c1983bd6d5db5fba376ccd63bfa529e8d02f23d5079b8f74a616308fb11d
Deleted: sha256:6fae60ef344644649a39240b94d73b8ba9c67f898ede85cf8e947a887b3e6557
Deleted: sha256:875bde2b9e2d99e7c1362993645a474fe621475c6fc1b1623c9ed5312b7bdeae
Deleted: sha256:bbdb5ee3757ef8f2633694016df5840fc3410422b37c22f98c0300e295ce75cc
Deleted: sha256:d718446240e3f48a904ad4bbf2a1f61737c5d70df35b8210d674a9517cdc9803
Deleted: sha256:a890440f4933412f9aafb056eb2f07f2276ed756631a81e960d4a8a6de5857a3
Deleted: sha256:68a74799a9e67953725058ef21a530f100025088943446aa60c73fba7beebd47
Deleted: sha256:b23e4b6b440d0e9ab4ffd7852fbf81edd6d5eb606e24d4950d83502e14af2856
Deleted: sha256:f115b0453c71fb4d21fdb6f579201984bd5033ae28ed5908978576a19282418b
Deleted: sha256:b0da82df3229cd06a2992449f2310caaa42f09fdfb088f4a98c5ea587ea85c7e
Deleted: sha256:f6f162dad6e64715d3d07e21d4574733860a557f2f89228d07909c1f6f04e882
Deleted: sha256:088f9eb16f16713e449903f7edb4016084de8234d73a45b1882cf29b1f753a5a
Deleted: sha256:799115b9fdd1511e8af8a8a3c8b450d81aa842bbf3c9f88e9126d264b232c598
Deleted: sha256:3549adbf614379d5c33ef0c5c6486a0d3f577ba3341f573be91b4ba1d8c60ce4
Deleted: sha256:1154ba695078d29ea6c4e1adb55c463959cd77509adf09710e2315827d66271a删除成功
1
2
3
4
5
6
7
8
9
10
11[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
sandu/python 3.6 3fc000939e8e 2 hours ago 1.05GB
sandu/python pro 3fc000939e8e 2 hours ago 1.05GB
sandu/ubuntu v2 02c1ed8e875c 3 hours ago 137MB
python 3.6 f93001dcf9ed 11 hours ago 924MB
nginx latest f68d6e55e065 10 days ago 109MB
ubuntu 14.04 2c5e00d77a67 8 weeks ago 188MB
centos latest 9f38484d220f 3 months ago 202MB
hello-world latest fce289e99eb9 6 months ago 1.84kB
ubuntu 15.10 9b9cb95443b5 2 years ago 137MB批量删除所有镜像
1 | [root@localhost ~]# docker rmi `docker images -q` |
Docker 容器连接
网络端口映射
使用 -P 参数创建一个容器,使用 docker ps 可以看到容器端口 5000 绑定主机端口 32770。
1 | [root@localhost ~]# docker run -d -P --name gentelella --restart always sandu/python:3.6 |
也可以使用 -p 标识来指定容器端口绑定到主机端口。
1 | [root@localhost ~]# docker run -d -p 32768:5000 --name gentelella --restart always sandu/python:3.6 |
两种方式的区别是:
- -P :是容器内部端口随机映射到主机的高端口。
- -p : 是容器内部端口绑定到指定的主机端口。(主机端口:容器内部端口)
可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
1 | [root@localhost ~]# docker run -d -p 127.0.0.1:32768:5000 --name gentelella --restart always sandu/python:3.6 |
这样我们就可以通过访问 127.0.0.1:32768 来访问容器的 5000 端口。
1 | # 停止并删除容器 |
默认都是绑定 tcp 端口,如果要绑定 UDP 端口,可以在端口后面加上 /udp。
1 | [root@localhost ~]# docker run -d -p 127.0.0.1:32768:5000/udp --name gentelella --restart always sandu/python:3.6 |
docker port 命令可以让我们快捷地查看端口的绑定情况。
1 | # 默认是tcp端口,查看udp端口的话需要在最后加上/udp |
Docker容器连接
端口映射并不是唯一把 docker 连接到另一个容器的方法。
docker 有一个连接系统允许将多个容器连接在一起,共享连接信息。
docker 连接会创建一个父子关系,其中父容器可以看到子容器的信息。
容器命名
当我们创建一个容器的时候,docker 会自动对它进行命名。另外,我们也可以使用 –name 标识来命名容器,例如:
1 | [root@localhost ~]# docker run -d -p 127.0.0.1:32768:5000 --name gentelella --restart always sandu/python:3.6 |
可以使用 docker ps 命令来查看容器名称。
1 | [root@localhost ~]# docker ps |
Docker实例
Docker 安装 Nginx
docker pull nginx 命令安装
查找 Docker Hub 上的 nginx 镜像
1 | [root@localhost ~]# docker search nginx |
拉取官方的镜像
1 | [root@localhost ~]# docker pull nginx |
等待下载完成后,我们就可以在本地镜像列表里查到 REPOSITORY 为 nginx 的镜像。
1 | [root@localhost ~]# docker images nginx |
以下命令使用 NGINX 默认的配置来启动一个 Nginx 容器实例:
1 | [root@localhost ~]# docker run --name test_docker_nginx -p 8081:80 -d nginx |
参数解析:
- test_docker_nginx:容器名称
- -d:设置容器在后台一直运行
- -p:端口进行映射,将本地的8081端口映射到容器内部的80端口
执行以上命令会生成一串字符串,类似c30cd0d51b31eaf3999ceee9724c269858e80417e8f0f03049127886f9b38134**,这个表示容器的 ID,一般可作为日志的文件名。
我们可以使用 docker ps 命令查看容器是否有在运行:
1 | [root@localhost ~]# docker ps |
PORTS 部分表示端口映射,本地的 8081 端口映射到容器内部的 80 端口。
在浏览器中打开 http://127.0.0.1:8081/ , 效果如下:
nginx 部署
首先,创建目录 nginx, 用于存放后面的相关东西。
1 | [root@localhost ~]# mkdir -p /home/nginx/www /home/nginx/logs /home/nginx/conf |
拷贝容器内 Nginx 默认配置文件到本地当前目录下的 conf 目录,容器 ID 可以查看 docker ps 命令输入中的第一列:
1 | [root@localhost ~]# docker ps |
部署命令
1 | [root@localhost home]# docker run -d -p 8081:80 --name test_docker_nginx_web -v /home/nginx/www:/usr/share/nginx/html -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/logs:/var/log/nginx nginx |
命令说明:
- -p 8081:80: 将容器的 80 端口映射到主机的 8081 端口。
- –name test_docker_nginx_web:将容器命名为test_docker_nginx_web。
- -v /home/nginx/www:/usr/share/nginx/html:将我们自己创建的 www 目录挂载到容器的 /usr/share/nginx/html。
- -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:将我们自己创建的 nginx.conf 挂载到容器的 /etc/nginx/nginx.conf。
- -v /home/nginx/logs:/var/log/nginx:将我们自己创建的 logs 挂载到容器的 /var/log/nginx。
启动以上命令后进入 /home/nginx/www 目录,创建 index.html 文件,内容如下:
1 |
|
使用浏览器访问,输出结果如下:
相关命令
重新载入 NGINX 可以使用以下命令发送 HUP 信号到容器:
1 | # docker kill -s HUP container-name |
重启 NGINX 容器命令:
1 | # docker restart container-name |
Docker 安装 PHP
安装 PHP 镜像
方法一、docker pull php
查找Docker Hub上的php镜像
1 | [root@localhost www]# docker search php |
拉取官方的镜像,标签为5.6-fpm
1 | [root@localhost ~]# docker pull php:5.6-fpm |
等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为php,标签为5.6-fpm的镜像。
1 | [root@localhost ~]# docker images |
Nginx + PHP 部署
启动 PHP:
1 | [root@localhost ~]# docker run --name test_docker_php -v /home/nginx/www/:/www:ro -d php:5.6-fpm |
命令说明:
- –name test_docker_php : 将容器命名为test_docker_php。
- -v /home/nginx/www:/www : 将主机中项目的目录 www 挂载到容器的 /www,ro 表示只读
创建 /home/nginx/conf/conf.d 目录:[root@localhost ~]# mkdir -p /home/nginx/conf/conf.d
在该目录下添加 /home/nginx/conf/conf.d/test_docker_php.conf 文件,内容如下:
1 | server { |
配置文件说明:
- php:9000: 表示 php-fpm 服务的 URL。
- /www/: 是 test_docker_php中 php 文件的存储路径,映射到本地的 /home/nginx/www 目录。
启动 Nginx :
1 | [root@localhost conf.d]# docker run -d -p 8081:80 --name test_docker_nginx_web -v /home/nginx/www:/usr/share/nginx/html:ro -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro -v /home/nginx/conf/conf.d:/etc/nginx/conf.d:ro -v /home/nginx/logs:/var/log/nginx --link test_docker_php:php nginx |
命令说明:
- -p 8081:80: 端口映射,把 nginx 中的 80 映射到本地的 8083 端口。
- /home/nginx/www: 是本地 html 文件的存储目录,/usr/share/nginx/html 是容器内 html 文件的存储目录。
- /home/nginx/conf/conf.d: 是本地 nginx 配置文件的存储目录,/etc/nginx/conf.d 是容器内 nginx 配置文件的存储目录。
- –link test_docker_php:php: 把 test_docker_php 的网络并入 nginx,并通过修改 nginx 的 /etc/hosts,把域名 php 映射成 127.0.0.1,让 nginx 通过 php:9000 访问 php-fpm。
接下来我们在 /home/nginx/www 目录下创建 index.php,代码如下:
1 |
|
浏览器打开 http://ip:8081/index.php ,显示如下:
要点总结
- php容器路径是/www,对应本机的web目录/home/nginx/www/
- nginx容器web路径是/usr/share/nginx/html,对应本机web目录/home/nginx/www/
- nginx容器配置文件/etc/nginx/nginx.conf,对应本机/home/nginx/conf/nginx.conf
- nginx容器配置文件/etc/nginx/conf.d路径,对应本机/home/nginx/conf/conf.d路径
- 运行php容器时需要把php容器路径跟本机web路径做映射
- 运行nginx容器时需要把nginx容器相关的路径跟本机路径做映射
- nginx容器关联有php容易,所以先启动php容器,然后再启动nginx容器,否则会报错:
1 | # 先启动php容器,然后再启动nginx容器 |
相互关系如下图所示:
Docker 安装 MySQL
安装方法
方法一、docker pull mysql
查找Docker Hub上的mysql镜像
1 | [root@localhost ~]# docker search mysql |
拉取官方的镜像,标签为5.6
1 | [root@localhost ~]# docker pull mysql:5.6 |
等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为mysql,标签为5.6的镜像。
1 | [root@localhost ~]# docker images | grep mysql |
方法二、通过 Dockerfile构建
首先,创建目录mysql,用于存放后面的相关东西。
1 | [root@localhost ~]# mkdir -p ~/mysql/data ~/mysql/logs ~/mysql/conf |
命令说明:
- data目录将映射为mysql容器配置的数据文件存放路径
- logs目录将映射为mysql容器的日志目录
- conf目录里的配置文件将映射为mysql容器的配置文件
进入创建的mysql目录,创建Dockerfile,这个是以Ubuntu系统为参考,CentOS系统使用的话需要修改
1 | FROM debian:jessie |
通过Dockerfile创建一个镜像,替换成你自己的名字
1 | [root@localhost ~]# docker build -t mysql . |
创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像
1 | [root@localhost ~]# docker images |grep mysql |
使用mysql镜像
运行容器
1 | # 如下这个命令是使用本地目录跟MySQL镜像目录想匹配的,使用官方MySQL镜像可以直接使用,若是使用上述自定的的dockfile创建爱你的MySQL镜像,需要把路径换成实际创建时使用的路径 |
命令说明:
- -p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
- -v -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
- -v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
- -v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
- -e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
查看容器启动情况
1 | # 查看当前正在运行的容器,发现没有MySQL容器 |
知识点
最新官方MySQL(5.7.19)的docker镜像在创建时映射的配置文件目录有所不同
MySQL(5.7.19)的默认配置文件是 /etc/mysql/my.cnf 文件。如果想要自定义配置,建议向 /etc/mysql/conf.d 目录中创建 .cnf 文件。新建的文件可以任意起名,只要保证后缀名是 cnf 即可。新建的文件中的配置项可以覆盖 /etc/mysql/my.cnf 中的配置项。
首先需要创建将要映射到容器中的目录以及.cnf文件,然后再创建容器
1 | # pwd |
命令说明:
- -p 3306:3306:将容器的3306端口映射到主机的3306端口
- -v /opt/docker_v/mysql/conf:/etc/mysql/conf.d:将主机/opt/docker_v/mysql/conf目录挂载到容器的/etc/mysql/conf.d
- -e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码
- -d: 后台运行容器,并返回容器ID
- imageID: mysql镜像ID
docker 安装 mysql 8 版本
1 | # docker 中下载 mysql |
登录docker里的MySQL镜像和远程登录
- 首次使用如下命令启动docker里的MySQL镜像时:
1 | [root@localhost ~]# cd /home/ |
- 遇到过一个特殊情况,就是关机后再开机,docker服务默认没有开机启动,启动docker服务后,使用命令:docker ps -a命令查看有之前启动过的MySQL镜像,然后启动后使用命令:docker exec -it 容器id bash进去环境,使用命令:mysql -uroot -p,输入密码,总是提示错误:ERROR 1045 (28000): Access denied for user ‘root‘@’localhost’ (using password: YES)。后来的解决办法是在需要输入密码的时候没有输入密码,直接按回车键就登录到MySQL里面来了。后来自己没有关机重启,只是把MySQL镜像服务停了,docker服务停了再按上述步骤操作,不输入密码就登陆不进去,输入密码才能登录进去。记录一下和这个奇葩的情况。
- 远程登录docker里的MySQL镜像,使用Navicat Premium软件,主机名或IP地址一栏填写docker所在服务器的地址,账号密码端口等填写MySQL镜像使用的,就能直接远程登录进来了,不用再做其他配置
Docker 安装 Tomcat
安装步骤
方法一、docker pull tomcat
查找Docker Hub上的tomcat镜像
1 | [root@localhost ~]# docker search tomcat |
这里我们拉取官方的镜像
1 | [root@localhost ~]# docker pull tomcat |
等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为tomcat的镜像。
1 | [root@localhost ~]# docker images | grep tomcat |
方法二、通过 Dockerfile 构建
首先,创建目录tomcat,用于存放后面的相关东西。
1 | [root@localhost ~]# mkdir -p ~/tomcat/webapps ~/tomcat/logs ~/tomcat/conf |
命令说明:
webapps目录将映射为tomcat容器配置的应用程序目录
logs目录将映射为tomcat容器的日志目录
conf目录里的配置文件将映射为tomcat容器的配置文件
进入创建的tomcat目录,创建Dockerfile,这个是以Ubuntu系统为参考,CentOS系统使用的话需要修改
1 | FROM openjdk:8-jre |
通过Dockerfile创建一个镜像,替换成你自己的名字
1 | [root@localhost ~]# docker build -t tomcat . |
创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像
1 | [root@localhost ~]# docker images|grep tomcat |
使用tomcat镜像
运行容器
1 | [root@localhost home]# docker run --name test_docker_tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat |
命令说明:
- -p 8080:8080:将容器的8080端口映射到主机的8080端口
- -v $PWD/test:/usr/local/tomcat/webapps/test:将主机中当前目录下的test挂载到容器的/test
查看容器启动情况
1 | [root@localhost home]# docker ps |
通过浏览器访问
浏览器地址看输入:http://ip:8080
Docker 安装 Python
安装步骤
方法一、docker pull python:3.5
查找Docker Hub上的python镜像
1 | [root@localhost ~]# docker search python |
这里我们拉取官方的镜像,标签为3.5
1 | [root@localhost ~]# docker pull python:3.5 |
等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为python,标签为3.5的镜像。
1 | [root@localhost ~]# docker images python:3.5 |
方法二、通过 Dockerfile 构建
首先,创建目录python,用于存放后面的相关东西。
1 | [root@localhost ~]# mkdir -p ~/python ~/python/myapp |
myapp目录将映射为python容器配置的应用目录
进入创建的python目录,创建Dockerfile,这个是以Ubuntu系统为参考,CentOS系统使用的话需要修改
1 | FROM buildpack-deps:jessie |
通过Dockerfile创建一个镜像,替换成你自己的名字
1 | [root@localhost ~]# docker build -t python:3.5 . |
创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像
1 | [root@localhost ~]# docker images python:3.5 |
使用python镜像
在/home/python/myapp目录下创建一个 helloworld.py 文件,代码如下:
1 | #!/usr/bin/python |
运行容器
1 | [root@localhost ~]# docker run -v /home/python/myapp:/usr/src/myapp -w /usr/src/myapp python:3.5 python helloworld.py |
命令说明:
- -v /home/python/myapp:/usr/src/myapp :将主机指定目录下的myapp挂载到容器的/usr/src/myapp
- -w /usr/src/myapp :指定容器的/usr/src/myapp目录为工作目录
- python helloworld.py :使用容器的python命令来执行工作目录中的helloworld.py文件
输出结果:
1 | Hello, World! |
Docker 安装 Redis
安装步骤
方法一、docker pull redis:5.0
查找Docker Hub上的redis镜像
1 | [root@localhost ~]# docker search redis |
这里我们拉取官方的镜像,标签为5.0
1 | [root@localhost ~]# docker pull redis:5.0 |
等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为redis,标签为5.0的镜像。
1 | [root@localhost ~]# docker images redis |
方法二、通过 Dockerfile 构建
首先,创建目录redis,用于存放后面的相关东西。
1 | [root@localhost ~]# mkdir -p ~/redis ~/redis/data |
- data目录将映射为redis容器配置的/data目录,作为redis数据持久化的存储目录
进入创建的redis目录,创建Dockerfile,这个是以Ubuntu系统为参考,CentOS系统使用的话需要修改
1 | FROM debian:jessie |
通过Dockerfile创建一个镜像,替换成你自己的名字
1 | [root@localhost ~]# docker build -t redis:5.0 . |
创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像
1 | [root@localhost ~]# docker images redis |
使用redis镜像
运行容器
1 | [root@localhost home]# docker run -p 6379:6379 -v $PWD/data:/data -d redis:5.0 redis-server --appendonly yes |
命令说明:
- -p 6379:6379 : 将容器的6379端口映射到主机的6379端口
- -v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data
- redis-server –appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置
查看容器启动情况
1 | [root@localhost ~]# docker ps |
连接、查看容器
使用redis镜像执行redis-cli命令连接到刚启动的容器,主机IP为127.0.0.1
1 | [root@localhost home]# docker exec -it 2c4e3bfd9691 redis-cli |
Docker 安装 MongoDB
安装步骤
方法一、docker pull mongo
查找Docker Hub上的mongo镜像
1 | [root@localhost ~]# docker search mongo |
这里我们拉取官方的镜像,标签为4.1
1 | [root@localhost ~]# docker pull mongo:4.1 |
等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为mongo,标签为4.1的镜像。
1 | [root@localhost home]# docker images mongo |
方法二、通过 Dockerfile 构建
首先,创建目录mongo,用于存放后面的相关东西。
1 | [root@localhost ~]# mkdir -p ~/mongo ~/mongo/db |
- db目录将映射为mongo容器配置的/data/db目录,作为mongo数据的存储目录
进入创建的mongo目录,创建Dockerfile,这个是以Ubuntu系统为参考,CentOS系统使用的话需要修改
1 | FROM debian:jessie-slim |
通过Dockerfile创建一个镜像,替换成你自己的名字
1 | [root@localhost ~]# docker build -t mongo:3.2 . |
创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像
1 | [root@localhost ~]# docker images mongo:3.2 |
使用mongo镜像
运行容器
1 | [root@localhost home]# docker run --name test_docker_mongodb -p 27017:27017 -v $PWD/mongodb/configdb:/data/configdb/ -v $PWD/mongodb/db/:/data/db/ -d mongo:4.1 --auth |
命令说明:
- -p 27017:27017 : 将容器的27017 端口映射到主机的27017 端口
- -v $PWD/mongodb/configdb:/data/configdb/ 主机中当前目录下的configdb挂载到容器的/data/configdb,作为mongo数据配置目录
- -v : $PWD/mongodb/db/:/data/db/ 将主机中当前目录下的db挂载到容器的/data/db,作为mongo数据存储目录
查看容器启动情况
1 | [root@localhost home]# docker ps |
使用mongo镜像执行mongo 命令连接到刚启动的MongoDB容器
1 | # 以 admin 用户身份进入mongo |
使用 mongo-express 管理mongodb
mongo-express是MongoDB的一个可视化图形管理工具,通过docker来运行一个mongo-express,来管理上面创建的mongodb服务。
1 | # 需要进行账号验证才能使用 |
使用 mongoclient 管理 mongodb
1 | # 需要进行账号验证才能使用 |
Docker 安装 Apache
安装步骤
方法一、docker pull httpd
查找Docker Hub上的httpd镜像
1 | [root@localhost ~]# # docker search httpd |
这里我们拉取官方的镜像
1 | [root@localhost ~]# docker pull httpd |
等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为httpd的镜像。
1 | [root@localhost home]# docker images httpd |
方法二、通过 Dockerfile构建
首先,创建目录apache,用于存放后面的相关东西。
1 | [root@localhost ~]# mkdir -p ~/apache/www ~/apache/logs ~/apache/conf |
命令说明:
- www目录将映射为apache容器配置的应用程序目录
- logs目录将映射为apache容器的日志目录
- conf目录里的配置文件将映射为apache容器的配置文件
进入创建的apache目录,创建Dockerfile,这个是以Ubuntu系统为参考,CentOS系统使用的话需要修改
1 | FROM debian:jessie |
Dockerfile文件中 COPY httpd-foreground /usr/local/bin/ 是将当前目录下的httpd-foreground拷贝到镜像里,作为httpd服务的启动脚本,所以我们要在本地创建一个脚本文件httpd-foreground
1 |
|
赋予httpd-foreground文件可执行权限
1 | [root@localhost ~]# chmod +x httpd-foreground |
通过Dockerfile创建一个镜像,替换成你自己的名字
1 | [root@localhost ~]# docker build -t httpd . |
创建完成后,我们可以在本地的镜像列表里查找到刚刚创建的镜像
1 | [root@localhost ~]# docker images httpd |
使用apache镜像
运行容器
1 | # 运行后使用docker ps查看,发现没有启动,也就是说这个命令有问题 |
命令说明:
-p 80:80 :将容器的80端口映射到主机的80端口
-v $PWD/www/:/usr/local/apache2/htdocs/ :将主机中当前目录下的www目录挂载到容器的/usr/local/apache2/htdocs/
-v $PWD/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf :将主机中当前目录下的conf/httpd.conf文件挂载到容器的/usr/local/apache2/conf/httpd.conf
-v $PWD/logs/:/usr/local/apache2/logs/ :将主机中当前目录下的logs目录挂载到容器的/usr/local/apache2/logs/
查看容器启动情况
1 | [root@localhost ~]# docker ps |
通过浏览器访问,出现的内容是index.html的内容
但是有个问题,配置文件这个要弄,估计还得从启动httpd的命令处着手,就跟nginx容器启动类似
MacOS系统配置Nginx+php+mysql的docker使用环境
- 创建目录
1 | mkdir -p /Users/sui/docker/nginx/conf.d && mkdir /Users/sui/www && cd /Users/sui/docker/nginx/conf.d && sudo touch default.conf |
- 启动php-fpm
1 | docker run --name sui-php -d -v /Users/sui/www:/var/www/html:ro php:7.1-fpm |
- 编辑 nginx 配置文件
配置文件位置:/Users/sui/docker/nginx/conf.d/default.conf。
1 | server { |
- 启动 nginx
1 | docker run --name sui-nginx -p 80:80 -d -v /Users/sui/www:/usr/share/nginx/html:ro \ |
测试结果
在 /Users/sui/www 下放两个文件:index.html index.phpmysql 服务器
1 | mkdir -p /Users/sui/docker/mysql/data /Users/sui/docker/mysql/logs /Users/sui/docker/mysql/conf |
1 | # 启动docker里的MySQL镜像 |
- 进入mysql客户端
1 | docker run -it --link sui-mysql:mysql --rm mysql sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"' |
- phpmyadmin
1 | docker run --name sui-myadmin -d --link sui-mysql:db -p 8080:80 phpmyadmin/phpmyadmin |
- 要点
若某个镜像中需要使用到另一个镜像中的资源,则需要使用-–link
进行关联,比如:nginx关联php,php关联mysql等。
Docker 命令大全
容器生命周期管理
run
1 | docker run :创建一个新的容器并运行一个命令 |
start/stop/restart
1 | docker start :启动一个或多个已经被停止的容器 |
kill
1 | docker kill :杀掉一个运行中的容器。 |
rm
1 | docker rm :删除一个或多少容器 |
pause/unpause
1 | docker pause :暂停容器中所有的进程。 |
create
1 | docker create :创建一个新的容器但不启动它 |
exec
1 | docker exec :在运行的容器中执行命令 |
容器操作
ps
1 | docker ps : 列出容器 |
inspect
1 | docker inspect : 获取容器/镜像的元数据。 |
top
1 | docker top :查看容器中运行的进程信息,支持 ps 命令参数。 |
attach
1 | docker attach :连接到正在运行中的容器。 |
events
1 | docker events : 从服务器获取实时事件 |
logs
1 | docker logs : 获取容器的日志 |
wait
1 | docker wait : 阻塞运行直到容器停止,然后打印出它的退出代码。 |
export
1 | docker export :将文件系统作为一个tar归档文件导出到STDOUT。 |
port
1 | docker port :列出指定的容器的端口映射,或者查找将PRIVATE_PORT NAT到面向公众的端口。 |
容器rootfs命令
commit
1 | docker commit :从容器创建一个新的镜像。 |
cp
1 | docker cp :用于容器与主机之间的数据拷贝。 |
diff
1 | docker diff : 检查容器里文件结构的更改。 |
镜像仓库
login
1 | docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub |
pull
1 | docker pull : 从镜像仓库中拉取或者更新指定镜像 |
push
1 | docker push : 将本地的镜像上传到镜像仓库,要先登陆到镜像仓库 |
search
1 | docker search : 从Docker Hub查找镜像 |
本地镜像管理
images
1 | docker images : 列出本地镜像。 |
rmi
1 | docker rmi : 删除本地一个或多少镜像。 |
tag
1 | docker tag : 标记本地镜像,将其归入某一仓库。 |
build
1 | docker build 命令用于使用 Dockerfile 创建镜像。 |
history
1 | docker history : 查看指定镜像的创建历史。 |
save
1 | docker save : 将指定镜像保存成 tar 归档文件。 |
load
1 | docker load : 导入使用 docker save 命令导出的镜像。 |
import
1 | docker import : 从归档文件中创建镜像。 |
info|version
info
1 | docker info : 显示 Docker 系统信息,包括镜像和容器数。。 |
version
1 | docker version :显示 Docker 版本信息。 |
Docker 资源汇总
Docker官方英文资源
docker官网:http://www.docker.com
Docker Windows 入门:https://docs.docker.com/docker-for-windows/
Docker CE(社区版) Ubuntu:https://docs.docker.com/install/linux/docker-ce/ubuntu/
Docker mac 入门:https://docs.docker.com/docker-for-mac/
Docker 用户指引:https://docs.docker.com/config/daemon/
Docker 官方博客:http://blog.docker.com/
Docker Hub: https://hub.docker.com/
Docker开源: https://www.docker.com/open-source
Docker中文资源
Docker中文网站:https://www.docker-cn.com/
Docker安装手册:https://docs.docker-cn.com/engine/installation/
Docker 国内镜像
阿里云的加速器:https://help.aliyun.com/document_detail/60750.html
网易加速器:http://hub-mirror.c.163.com
官方中国加速器:https://registry.docker-cn.com
ustc的镜像:https://docker.mirrors.ustc.edu.cn
daocloud:https://www.daocloud.io/mirror#accelerator-doc(注册后使用)