Ubuntu中安装与使用Docker
不同的Linux版本,安装Docker Container Engine(Docker容器引擎)的方法不尽相同,需要根据各自的系统版本去安装。以下是在ubuntu-18.10-live-server-amd64
系统中安装Docker CE。
# 安装Docker CE,依次执行以下指令
$ sudo apt-get remove docker docker-engine docker.io containerd runc
$ sudo apt-get update
# linux curl是通过url语法在命令行下上传或下载文件的工具软件
# 最后有一个中划线
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io # 会下载390M左右的数据
# 安装好Docker后,查看其状态
$ sudo systemctl status docker
# 运行hello-world映像,验证Docker CE是否已正确安装
$ sudo docker run hello-world
Docker容器引擎,就安装成功了!
1. Docker常用命令
这是docker本身的指令,跟Linux系统的版本就没有关系了!
1.1 一些通用命令
# 获取有关Docker版本的信息
$ sudo docker version
$ docker -v
# 获取所有可用Docker命令的列表
$ docker
1.2 镜像相关命令
1.2.1 查看镜像
# 查看当前系统可用的镜像
$ sudo docker images
###1.2.2 搜索镜像 + 拉取镜像
# 在线搜索镜像
$ sudo docker search 镜像名称
$ sudo docker search centos7
# 拉取镜像
# 就是从Docker仓库下载镜像到本地,镜像名称格式为 “名称:版本号”,如果版本号不指定则是最新的版本
$ sudo docker pull centos:7
###1.2.3 删除镜像
要求所删除的镜像不能被任何的容器正在使用,否则需要先删除容器,再删除镜像。
# 查看当前宿主机可用的镜像
$ sudo docker images
# 删除镜像
$ sudo docker rmi centos # 使用名称删除镜像
$ sudo docker rmi 镜像id # 按照镜像id删除镜像
# 删除所有镜像
$ sudo docker rmi `docker images -q` # 反单引
1.2.4 镜像源配置
ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
需要给Linux系统添加一个配置文件:/etc/docker/daemon.json
国内比较好用的几个镜像源 :
Docker 官方中国区:https://registry.docker-cn.com
网易:http://hub-mirror.c.163.com
中国科技大学:https://docker.mirrors.ustc.edu.cn
阿里云:https://y0qd3iq.mirror.aliyuncs.com
配置ustc镜像源
# 在宿主机中操作
# 新建目录及文件
$ sudo mkdir /etc/docker # 创建目录
$ sudo vim /etc/docker/daemon.json # 创建docker的配置文件. 默认情况下,是没有这个配置文件的
# 在文件中添加如下内容
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
# 重启docker服务
$ sudo service docker restart
# 验证镜像源配置是否成功
$ sudo docker info|grep Mirrors -A 1 # 会看到配置镜像源信息
1.3 容器相关命令
容器,也是docker中的核心概念,容器是由镜像运行产生的运行实例。镜像和容器的关系,就如同Java语言中类和对象的关系。 (镜像是类,容器就是对象)
Docker提供的关于容器的操作有:
- 查看容器
- 创建容器
- 启动容器
- 停止容器
- 文件拷贝
- 目录挂载
- 查看容器ip地址
- 删除容器
1.3.1 查看容器
# 查看正在运行过的容器
$ sudo docker ps
#查看所有容器
$ sudo docker ps -a
1.3.2 创建容器
可以基于已有的镜像来创建和启动容器,创建与启动容器使用命令:
语法格式:$ sudo docker run [参数列表] 使用的镜像名称或ID /bin/bash
参数说明:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
–name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件 映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
交互式容器
什么是交互式容器?启动容器之后会直接进入容器的命令行终端,如果退出容器,则容器停止运行。
使用exit
命令退出容器。
# 先查询当前主机中可用的镜像
$ sudo docker images
# 拉取一个镜像;这一步不是每次启动容器都要做的,如果主机中已有此镜像,就无需再拉取了
$ sudo docker pull centos:7
# 创建并启动名称为 mycentos7_inter 的交互式容器;下面指令中的镜像名称 centos:7 也可以使用镜像id
# /bin/bash 表示进入容器后,shell脚本(指令)使用的解析器
$ sudo docker run -it --name=mycentos7_inter centos:7 /bin/bash
参数说明:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
–name :为创建的容器命名。
创建容器成功后,Linux指令中显示的用户标识也跟着变了
[root@030d34106602 /]#
切换成root用户操作了,不然指令执行都在验证,执行速度太慢!
想要退出当前容器,执行exit
指令。
是否创建成功,可以通过docker ps
或docker ps -a
查看容器。
守护式容器
对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。
命令如下(同一主机中的容器间名称不能重复):
# 创建并启动守护式容器
$ sudo docker run -di --name=mycentos7_daemon centos:7
# 退出容器
$ sudo docker exec -it mycentos7_daemon /bin/bash
# 登录进入容器,命令为:(exit退出时,守护式容器不会停止)
$ sudo docker exec -it container_name (或者 container_id) /bin/bash
$ sudo docker exec -it mycentos7_daemon /bin/bash
参数说明:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
–name :为创建的容器命名。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
然后登录进容器
再使用exit
指令退出守护式容器,再用docker ps
查看正在运行的容器,可以看到上面启动的守护式容器,还在运行中。
那么问题来了? 我要怎么退出一个守护式容器呢??–>看下面“停止容器”
1.3.3 停止与重启容器
# 停止正在运行的容器:docker stop 容器名称或者ID
$ sudo docker stop mycentos7_daemon
# 停止守护式容器后,再查看正在运行的容器中,有没有被停止的守护式容器
$ sudo docker ps
# 启动已运行过的容器(QQQQ: 没有运行的过的容器,能否用这种方式启动?):docker start 容器名称或者ID
$ sudo docker start mycentos7_daemon
1.3.4 文件拷贝
-
将linux宿主机中的文件拷贝到容器中
语法:
docker cp 需要拷贝的文件或目录 容器名称:容器目录
# 在主机根目录下,创建一个文件abc.txt
$ sudo touch a.txt
# 在主机目录下,执行指令。
# 复制a.txt到 mycentos7_daemon 容器的 / 目录下 要保证容器已启动
$ sudo docker cp a.txt mycentos7_daemon:/
# 进入 mycentos7_daemon 容器
$ sudo docker exec -it mycentos7_daemon /bin/bash
# 查看容器 / 目录下文件
$ sudo ll
参数说明:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
- 将文件从容器内拷贝出来到linux宿主机中
语法:docker cp 容器名称:容器目录 需要拷贝的文件或目录
# 进入容器后,如果没有什么文件,就创建一个,如文件c.txt
$ sudo touch c.txt
# 退出容器
$ sudo exit
# 在Linux宿主机器执行复制
# 将容器 mycentos7_daemon 中根目录/下的c.txt文件复制到Linux宿主机器的/root目录下
$ sudo docker cp mycentos7_daemon:/c.txt /root
注意:容器在停止状态下,也可以完成文件的拷贝。
1.3.5 目录挂载
可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件 从而去影响容器。
创建容器时添加-v
参数,后边为宿主机目录:容器目录
例如: sudo docker run -di -v /usr/local/test:/usr/local/test --name=mycentos3 centos:7
QQQQ:如果我现在已有容器了,想要来建立一个挂载目录,怎么办呢?
创建容器时,建立挂载目录:
# 创建linux宿主机器要挂载的目录
$ sudo mkdir /usr/local/test
# 创建并启动容器 mycentos3,并挂载linux中的/usr/local/test目录到容器的/usr/local/test目录
# 后面,在linux中的/usr/local/test中操作,相当于对容器相应目录操作
# 创建一个守护式容器
$ sudo docker run -di -v /usr/local/test:/usr/local/test --name=mycentos3 centos:7
# 在linux宿主机下,创建文件
$ sudo touch /usr/local/test/def.txt
# 进入容器
$ sudo docker exec -it mycentos3 /bin/bash
# 在容器中,查看目录中是否有对应文件def.txt
$ sudo ll /usr/local/test
参数说明:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
–name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件 映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
另外,还要注意:
如果你共享的是多级目录,可能会出现权限不足的提示。 这是因为CentOS7中的安全模块selinux把权限禁掉了,需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题。
1.3.6 查看容器ip
语法:docker inspect 容器名称(容器ID)
# 在linux宿主机下查看容器的ip
$ sudo docker inspect mycentos7_daemon
注意:
容器之间在一个局域网内,linux宿主机器可以与容器进行通信;但是外部的物理机笔记本是不能与容器直接通信的,如果需要则要通过宿主机器端口的代理。
1.3.7 删除容器
分为删除指定容器,与删除所有容器
语法:
删除指定窗口:docker rm 容器名称(容器ID)
# 删除指定容器
$ sudo docker rm mycentos_daemon
# 删除所有容器
$ sudo docker rm `docker ps -a -q` # 反单引
如果容器是运行状态,则会删除失败,需要停止容器才能删除。
2. Docker容器部署应用
在Docker容器中部署应用程序,就相当于是安装软件。
以安装如下应用程序为例:
- MySQL
- Tomcat
- Redis
- Nginx
2.1 MySQL容器部署
###查看与搜索镜像
查看一下当前Linux主机中有哪些镜像及容器:
# 查看镜像
$ sudo docker images
# 查看容器
$ sudo docker ps -a # 查看全部容器
# 搜索一下mysql有哪些镜像
$ sudo docker search mysql
###拉取镜像
# Linux宿主机中操作:拉取MySQL的镜像,如果有了就不需要再拉取了
$ sudo docker pull centos/mysql-57-centos7
创建容器
# Linux宿主机中操作:使用镜像创建容器
$ sudo docker run -di --name=mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root centos/mysql-57-centos7
参数说明:
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,就是创建交互式容器了。)。
-i:表示运行容器
–name :为创建的容器命名。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 容器中的MySQL的root用户密码,作为root用户远程登陆之用(如果是在容器中使用root用户登录的话, 那么其密码为空)
操作容器中的MySQL
# 登录进容器
$ sudo docker exec -it mysql5.7 /bin/bash
# 登录容器里面的mysql
$ sudo mysql -u root -p # 在容器中使用root用户登录的话,不需要输入密码,密码写为空
参数说明:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
远程登录MySQL
# 查看ip
# 如果要内部连接该mysql(指当前Linux宿主机内),比如其他容器要连接mysql容器的mysql的时候,可以使用如下命令查看Ip
$ sudo docker inspect mysql5.7
默认情况下,MySQL容器的IP地址为"IPAddress": "172.17.0.2"
使用Navicat在windows中进行远程登录,连接在docker容器中的MySQL数据库。
docker容器中的MySQL数据库的参数:
主机名或地址:虚拟机IP
端口:3306
用户名:root
密码:root
地址映射关系图示
2.2 Tomcat容器部署
###安装并启动tomcat容器
# 查询
$ sudo docker search tomcat
# 拉取镜像
$ sudo docker pull tomcat:7
# 创建tomcat容器,并挂载webapps目录
# 要确保虚拟机存在/usr/local/tomcat/webapps目录,没有的话要先创建好
$ sudo docker run -di --name=mytomcat7 -p 9090:8080 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat
# 如果出现 WARNING: IPv4 forwarding is disabled. Networking will not work.
#执行如下操作
# 1、编辑 sysctl.conf
vi /etc/sysctl.conf
# 2、在上述打开的文件后面添加如下配置:打开IPv4 forwarding
net.ipv4.ip_forward=1
# 3、重启network
systemctl restart network
参数说明:
-i:表示运行容器
–name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件 映射。注意:最好做目录映射,这样就可以在宿主机上做修改,然后直接共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
测试tomcat安装成功与否
本地主机通过浏览器访问虚拟机的9090端口,我的地址为:http://192.168.178.147:9090
此时,会显示404错误,说明是资源找不到。
原因:宿主机/usr/local/tomcat/webapps下没有任何资源,对应映射到容器Tomcat的webapps目录中也没有任何项目资源,所以访问不到。
# 进入容器tomcat中去查看
# 进入的默认目录就是 `root@c632fdf96976:/usr/local/tomcat#`
$ sudo docker exec -it mytomcat7 /bin/bash
# 查看容器tomcat的webapps目录,可见它是空目录,没有任何资源
# 可以往tomcat的/user/local/tomcat/webapps下部署应用,然后再访问
2.3 Redis容器部署
安装并运行Redis容器
# 查询redis镜像
$ sudo docker search redis
# 拉取redis镜像,如果有3.2版本及以上,最好安装它们
$ sudo docker pull redis
# 创建并启动redis容器
$ sudo docker run -di --name=myredis -p 6379:6379 redis
# 进入redis容器
$ sudo docker exec -it myredis /bin/bash # 默认进入到‘root@5a543e59cf93:/data#’
# 容器中启动redis客户端,进行数据操作
$ sudo cd /usr/local # 进入redis安装目录
$ sudo cd /usr/local/bin # 进入redis安装程序的bin目录
$ sudo ./redis-cli # 启动redis客户端
[外链图片转存失败(img-hC32Yfyl-1569083889276)(F:\pics4MarkDown\1568133487915.png)]
远程连接Redis
使用Redis Desktop Manager管理工具连接
2.4 Zookeeper容器部署
# 查询镜像
$ sudo docker search zookeeper
# 拉取镜像
$ sudo docker pull zookeeper
# 创建并启动 zookeeper 容器
$ sudo docker run -di --name=myzookeeper -p 2181:2181 zookeeper
# 查看是否成功启动
$ sudo docker ps # 查看正在运行的容器
2.5 Nginx容器部署
# 查询镜像
$ sudo docker search nginx
# 拉取镜像
$ sudo docker pull nginx
# 创建并启动 nginx 容器
$ sudo docker run -di --name=mynginx -p 80:80 nginx
# 本地主机访问Nginx容器 http://宿主虚拟机IP/
192.168.178.147 # 80端口可以不写
Docker Compose
Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
它是一个定义和运行多容器的 docker应用工具。
使用compose,通过配置docker-compose.yml文件同时启动多个容器。
迁移与备份
Dockerfile
私有镜像仓库
eper
拉取镜像
$ sudo docker pull zookeeper
创建并启动 zookeeper 容器
$ sudo docker run -di --name=myzookeeper -p 2181:2181 zookeeper
查看是否成功启动
$ sudo docker ps # 查看正在运行的容器
## 2.5 Nginx容器部署
```sh
# 查询镜像
$ sudo docker search nginx
# 拉取镜像
$ sudo docker pull nginx
# 创建并启动 nginx 容器
$ sudo docker run -di --name=mynginx -p 80:80 nginx
# 本地主机访问Nginx容器 http://宿主虚拟机IP/
192.168.178.147 # 80端口可以不写