Docker的安装与启动
Docker可以运行在MAC、Windows、CentOS、DEBIAN、UBUNTU等操作系统上,提供社区版和企业版 。
- 安装在windows系统时,要求windows系统是win10专业版;
- 安装在Linux系统中时,要求Linux是64位的。如果使用CentOS系统,建议使用CentOS7(因为Docker对CentOS7的支持不太好)
下面,在CentOS7.6-64Bit系统下安装Docker。
(这里用的腾讯云服务器!)
目标:在线安装docker,并使用命令启动、停止docker
实现步骤:
这是在线安装,需要联网才行,而且网速要好(下载速度不低于1M/s)。
以下在root用户下执行。
# 1、yum 包更新到最新
yum update
# 2、作用:安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依
赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 3、 设置yum源(以下2选1即可)
# 3.1、方案一:使用ustc的(推荐) 这个网站的连接不需要
yum-config-manager --add-repo http://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
# 3.2、方案二:使用阿里云(可能失败)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4、 安装docker;出现输入的界面都按 y
yum install -y docker-ce
# 5、 查看docker版本
docker -v
ustc是老牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在用。ustc的docker镜像加速器速度很快。ustc docker mirror的优势之一就是不需要注册,是真正的公共服务。
国内比较好用的几个镜像源 :
Docker 官方中国区:https://registry.docker-cn.com
网易:http://hub-mirror.c.163.com
中国科技大学:https://docker.mirrors.ustc.edu.cn
阿里云:https://y0qd3iq.mirror.aliyuncs.com
需要给Linux系统添加一个配置文件:/etc/docker/daemon.json
# 新建目录及文件
$ mkdir /etc/docker # 创建目录
$ vim /etc/docker/daemon.json # 创建docker的配置文件
# 如果系统刚安装时,没有vim工具,可以使用vi指令。或者安装vim
$ sudo yum install vim
# 在daemon.json文件中添加如下内容
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
# 重启docker服务(docker内运行的所有容器都会停止,这就相当于windwos系统重启,应用程序都会被关闭。)
$ sudo systemctl restart docker
# 验证镜像源配置是否成功
$ docker info|grep Mirrors -A 1 # 会看到配置镜像源信息
如果使用ustc镜像源下载镜像比较慢的话,可以考虑换成阿里云的。
# 启动docker服务:
systemctl start docker
# 启动docker服务(docker的守护进程)后,运行docker的hello-world程序,来验证是否成功安装并启动
docker run hello-world
# 停止docker服务:
systemctl stop docker
# 重启docker服务:
systemctl restart docker
# 查看docker服务状态:
systemctl status docker
# 设置开机启动docker服务:
systemctl enable docker
这是docker本身的指令,跟Linux系统的版本就没有关系了!
guest
用户进行的操作。 $
符号开关,表示当前用户是非root用户。先修改一下/etc/sudoers
文件的配置内容,给guset
赋予能够执行一切指令的权限:
# 获取有关Docker版本的信息
$ docker -v
# 获取所有可用Docker命令的列表
$ docker
# 查看当前系统可用的镜像
$ docker images
# 在线搜索镜像
$ docker search 镜像名称
$ docker search centos
# 拉取镜像
# 就是从Docker仓库下载镜像到本地,镜像名称格式为 “名称:版本号”,如果版本号不指定则是最新的版本
$ docker pull centos:7
要求所删除的镜像不能被任何的容器正在使用,否则需要先删除容器,再删除镜像。
# 查看当前宿主机可用的镜像
$ sudo docker images # 普通用户只用docker images指令是没权限查看镜像列表的
# 删除镜像
$ sudo docker rmi centos # 使用名称删除镜像
$ sudo docker rmi 镜像id # 按照镜像id删除镜像
# 删除所有镜像
$ sudo docker rmi `docker images -q` # 反单引
容器,也是docker中的核心概念,容器是由镜像运行产生的运行实例。镜像和容器的关系,就如同Java语言中类和对象的关系。 (镜像是类,容器就是对象)
Docker提供的关于容器的操作有:
# 查看正在运行过的容器
$ sudo docker ps
#查看所有容器
$ sudo docker ps -a
可以基于已有的镜像来创建和启动容器,创建与启动容器使用命令:
语法格式:$ 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
# 创建并启动名称为 mycentos7_inter 的交互式容器;下面指令中的镜像名称 centos 也可以使用镜像id
# /bin/bash 表示进入容器后,shell脚本(指令)使用的解析器
$ sudo docker run -it --name=mycentos7_inter centos /bin/bash
参数说明:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
–name :为创建的容器命名。
创建容器成功后就直接进入了容器,Linux指令中显示的用户标识也跟着变了
[root@030d34106602 /]#
一进入容器,默认是拥有的root用户权限
想要退出当前容器,执行exit
指令。
是否创建成功,可以通过$ docker ps
或$ docker ps -a
查看容器。
对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。(docker本身就有一个守护进程,也就是可以在后台运行的进程,它的作用就是保持docker程序处于运行之中。)
命令如下(同一主机中的容器间名称不能重复):
# 创建并启动守护式容器
$ sudo docker run -di --name=mycentos7_daemon centos
# 登录进入容器,命令为:(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
查看正在运行的容器,可以看到上面启动的守护式容器,还在运行中。
那么问题来了? 我要怎么退出一个守护式容器呢??–>看下面“停止容器”
要回到宿主机中来执行docker命令(容器中是没有安装docker的)
# 停止正在运行的容器:docker stop 容器名称或者ID
$ sudo docker stop mycentos7_daemon
# 停止守护式容器后,再查看正在运行的容器中,看看守护式容器有没有被停止
$ sudo docker ps
# 启动已运行过的容器(QQQQ: 没有运行的过的容器,能否用这种方式启动?):docker start 容器名称或者ID
$ sudo docker start mycentos7_daemon
将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:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
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
注意:容器在停止状态下,也可以完成文件的拷贝。
可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件 从而去影响容器。
创建容器时添加-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 来解决挂载的目录没有权限的问题。
语法:docker inspect 容器名称(容器ID)
# 在linux宿主机下查看容器的ip
$ sudo docker inspect mycentos7_daemon
注意:
容器之间在一个局域网内,linux宿主机器可以与容器进行通信;但是外部的物理机笔记本是不能与容器直接通信的,如果需要则要通过宿主机器端口的代理。
分为删除指定容器,与删除所有容器
语法:
删除指定窗口:docker rm 容器名称(容器ID)
# 删除指定容器
$ sudo docker rm mycentos_daemon
# 删除所有容器
$ sudo docker rm `docker ps -a -q` # 反单引
如果容器是运行状态,则会删除失败,需要停止容器才能删除。
在Docker容器中部署应用程序,就相当于是安装软件。
以安装如下应用程序为例:
查看一下当前Linux主机中有哪些镜像及容器:
# 查看镜像
$ sudo docker images
# 查看容器
$ sudo docker ps -a # 查看全部容器
# 搜索一下mysql有哪些镜像
$ sudo docker search mysql
# Linux宿主机中操作:拉取MySQL的镜像,如果有了就不需要再拉取了
$ sudo docker pull centos/mysql-57-centos7
# Linux宿主机中操作:使用镜像创建mysql守护式容器,并进行端口映射,同时配置环境变量
$ sudo docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql
参数说明:
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t 两个参数,就是创建交互式容器了。)。
-i:表示运行容器
–name :为创建的容器命名。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 容器中的MySQL的root用户密码,作为root用户远程登陆之用
# 登录进容器
$ sudo docker exec -it mysql /bin/bash
# 登录容器里面的mysql,登录后,默认使用的是容器的root用户
mysql -u root -p # 在容器中使用root用户登录的话,不需要输入密码,密码写为空
参数说明:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
# 查看ip
# 如果要内部连接该mysql(指当前Linux宿主机内),比如其他容器要连接mysql容器的mysql的时候,可以使用如下命令查看Ip
$ sudo docker inspect mysql
使用Navicat在windows中进行远程登录,连接在docker容器中的MySQL数据库。
docker容器中的MySQL数据库的参数:
主机名或地址:虚拟机IP
端口:3306
用户名:root
密码:root
使用最新版本的MySQL时,Navicat连接Docker -Mysql会报错:caching sha_2_password cannot be load。
原因:
docker上pull的mysql为最新的,最新的MySQL更换了新的身份验证插件(caching_sha2_password), 原来的身份验证插件为(mysql_native_password) 。
解决方案:
登录进入mysql容器,执行以下mysql指令,然后再用Navicate连接。
alter user 'root'@'%' identified with mysql_native_password by 'root';
# 查询
$ sudo docker search tomcat
# 拉取镜像
$ sudo docker pull tomcat:7
# 创建并启动tomcat容器,并挂载webapps目录
# 要确保虚拟机存在/usr/local/tomcat/webapps目录,没有的话要先创建好
$ sudo docker run -di --name=tomcat7 -p 8080:8080 -v /usr/local/tomcat/webapps:/usr/local/tomcat/webapps tomcat:7
# 如果出现 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做多个端口映射
本地主机通过浏览器访问虚拟机的8080端口,我的地址为:http://192.168.178.147:8080
此时,会显示连接不上,HTTP ERROR 404错误,说明是资源找不到。这是正确的,并不是说tomcat没有安装没有启动。
原因:
宿主机/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下部署应用,然后再访问。
比如,往tomcat容器中部署dubbo-admin.war包的项目
dubbo-admin默认的账号密码:guest/guest
# 查询redis镜像
$ sudo docker search redis
# 拉取redis镜像,如果有3.2版本及以上,最好安装它们(redis的geo功能,要求它是3.2及其以上版本)
$ sudo docker pull redis:3.2
# 创建并启动redis容器
$ sudo docker run -di --name=redis3.2 -p 6379:6379 redis
# 进入redis容器
$ sudo docker exec -it redis3.2 /bin/bash # 默认进入到‘root@5a543e59cf93:/data#’
# 容器中启动redis客户端,进行数据操作
$ sudo cd /usr/local # 进入redis安装目录
$ sudo cd /usr/local/bin # 进入redis安装程序的bin目录
$ sudo ./redis-cli # 启动redis客户端
使用Redis Desktop Manager管理工具连接
# 查询镜像
$ sudo docker search zookeeper
# 拉取镜像
$ sudo docker pull zookeeper
# 创建并启动 zookeeper 容器
$ sudo docker run -di --name=zookeeper -p 2181:2181 zookeeper
# 查看是否成功启动
$ sudo docker ps # 查看正在运行的容器
# 查询镜像
$ sudo docker search nginx
# 拉取镜像
$ sudo docker pull nginx
# 创建并启动 nginx 容器
$ sudo docker run -di --name=nginx -p 80:80 nginx
# 本地主机访问Nginx容器 http://宿主虚拟机IP/
192.168.178.151 # 80端口可以不写
Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
它是一个定义和运行多容器的 docker应用工具。
使用compose,通过配置docker-compose.yml文件同时启动多个容器。
Docker-Compose将所管理的容器分为三层,分别是:
一个工程当中可包含多个服务;每个服务中定义了容器运行的镜像,参数,容器间依赖关系,一个服务当中可包括多个容器实例。
Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工 程,若无特殊指定工程名即为当前目录名。
Docker-Compose工程配置文件默认为docker-compose.yml
,可通过环境变量COMPOSE_FILE
或-f
参数自定义配 置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
还使用一个Dockerfile模板文件
,让用户很方便地定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如:要部署一个Web项目,除了Web服务容器,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
要求是64-bit Linux
,而且还要求其他一些库的支持。
Compose目前已经完全支持Linux、Mac OS和Windows。安装Compose之前,需要先安装Docker。
下面我们将compose
安装到CentOS7.6-64bit系统中:
(二进制包方式安装的,卸载时,删除二进制文件即可)
# 安装 py-pip
# 检查linux中有没有安装py-pip包,终端执行 pip -V
$ sudo pip -v
# 若没有安装,则进行安装
$ sudo yum -y install epel-release
$ sudo yum -y install python-pip
$ sudo pip install --upgrade pip # 升级到最新版本
# 安装docker-compose
$ sudo pip install docker-compose --ignore-installed requests
# curl是通过url语法命令在线上传或下载文件的工具
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/dockercompose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose # 设置文件的可执行权限 +x
# 查看版本信息
$ sudo docker-compose -version
# 二进制包方式安装的,删除二进制文件即可
$ sudo rm -rf /usr/local/bin/docker-compose
docker-compose [command] --help
Compose命令的基本的使用格式为:
docker-compose [-f
-f,–file FILE 指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定。
-p,–-project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。
--verbose 输出更多调试信息
-v,–-version 打印版本并退出
Commands:
build Build or rebuild services
bundle Generate a Docker bundle from the Compose file
config Validate and view the Compose file
create Create services
down Stop and remove containers, networks, images, and volumes
events Receive real time events from containers
exec Execute a command in a running container
help Get help on a command
images List images
kill Kill containers
logs View output from containers
pause Pause services
port Print the public port for a port binding
ps List containers
pull Pull service images
push Push service images
restart Restart services
rm Remove stopped containers
run Run a one-off command
scale Set number of containers for a service
start Start services
stop Stop services
top Display the running processes
unpause Unpause services
up Create and start containers
version Show the Docker-Compose version information
模板文件配置是使用Docker Compose的核心,涉及的指令关键字也比较多。
默认的模板文件名称为docker-compose.yml
,格式为YAML格式。
比如一个Compose模板文件:
version:"3" # 指定模板文件版本,也就是指定了应用版本
services:
nginx1: # 定义一个服务,取名为 nginx1
images: nginx # 使用nginx镜像来创建容器
ports:
- "80:80" # 端口映射,宿主机端口:容器端口
volumes:
- /usr/local/abc:/usr/local/abc # 数据卷,即目录挂载
# volumes:
# networks:
docker-compose.yml模板文件主要分为3个区域,如下:
- services 服务
在它下面可以定义应用需要的一些服务,每个服务都有自己的名字、使用的镜像、挂载的数据卷、所属的网 络、依赖哪些其他服务等等。 一个服务中可以有多个容器
- volumes 数据卷
在它下面可以定义数据卷(名字等等),然后挂载到不同的服务下去使用。
- networks 应用的网络
在它下面可以定义应用的名字、使用的网络类型等等。 这个“应用”,就是一个具体的web应用,相当于docker中的project。
docker-compose.yml文件使用的主要命令
指令 | 功能 |
---|---|
build | 指定服务镜像Dockerfile所在路径 |
cap_add, cap_drop | 指定容器的内核能力(capacity)分配 |
command | 覆盖容器启动后默认执行的命令 |
cgroup_parent | 指定父cgroup组,意味着将基础该组的资源限制 |
container_name | 指定容器名称。默认将会使用项目名称服务名称序号这样的格式 |
devices | 指定设置映射关系 |
dns | 自定义DNS服务器。可以是一个值,也可以是一个列表 |
dns_search | 配置DNS搜索域。可以是一个值,也可以是一个列表 |
dockerfile | 指定额外编译镜像的Dockerfile文件,可以通过该指令来指定 |
env_file | 从文件中获取环境变量,可以为单独的文件路径或列表 |
environment | 设置环境变量,可以使用数组或字典两种格式 |
expose | 暴露端口 |
external_links | 链接到docker-compose.yml外部的容器,甚至可以是非Compose管理的外部容器 |
extra_hosts | 指定额外的host名称映射信息 |
image | 指定为镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取这个镜像 |
labels | 指定服务镜像Dockerfile所在路径 |
links | 链接到其他服务中的容器 |
log_driver | 指定日志驱动类型,类似于Docker中的–log-driver参数。目前支持三种日志驱动类型: log_driver:“json-file”、log_driver:“syslog”、log_driver:“none” |
log_opt | 日志驱动的相关参数 |
net | 设置网络模式。参数类似于docker clinet的–net参数一样 |
pid | 跟主机系统共享进程命名空间。打开该选项的容器之间,以及容器和宿主机系统之间可以 通过进程ID来相互访问和操作 |
ports | 暴露端口信息 |
security_opt | 指定容器模板标签(label)机制的默认属性(如用户、角色、类型、级别等) |
ulimits | 指定容器的ulimits限制值 |
volumes | 数据卷所挂载路径设置。可以设置宿主机路径(HOST:CONTAINER)或加上访问模式 (HOST:CONTAINER:ro) |
需求:编写docker-compose.yml模版文件,实现同时启动tomcat、mysql和redis容器。
# 创建文件夹
$ sudo mkdir -p /usr/local/docker-compose
#进入文件夹
$ cd /usr/local/docker-compose
#创建 docker-compose.yml文件;内容如下
$ sudo vi docker-compose.yml
建议使用EditPlus去编写Linux的配置文件。
version: '3'
# 服务配置
services:
redis1: # 服务名
image: redis:3.2 # 使用redis镜像创建容器
ports:
- "6379:6379" # 端口映射,宿主机端口:容器端口
container_name: "redis1" # 创建的容器名称
networks: # 定义容器所处的网络
- dev
mysql1:
image: mysql # 镜像未加版本号,就是使用的最新版本
environment:
MYSQL_ROOT_PASSWORD: "root"
ports:
- "3306:3306"
container_name: "mysql1"
networks:
- dev
tomcat:
images: tomcat:7
ports:
- "8080:8080"
container_name: "tomcat1"
networks:
- dev
- pro
nginx1:
image: nginx
ports:
- "80:80"
container_name: "nginx1"
networks:
- pro
# 网络配置
networks:
dev: # 开发环境
driver: bridge
pro: # 生产环境
driver: bridge
以上配置文件中,各容器所有网络的情况:
#启动前最好把docker重启,不然原来的tomcat/mysql/redis容器也是启动状态的话,那么会因端口冲突而启动失败
$ sudo systemctl restart docker
$ cd /usr/local/docker-compose
$ sudo docker-compose up
# 如果想后台启动,则使用如下命令
$sudo docker-compose up -d
# 若要停止
$sudo docker-compose stop
查看运行情况:
QQQQ:如何在centos容器中安装tomcat等应用程序??
centos容器中,就得以原生方式安装应用(上传应用安装包,安装)。
涉及到的命令有:
docker commit
将容器保存为镜像
docker save
将镜像备份为tar文件
docker load
根据tar文件恢复镜像
# 将容器保存为镜像
$ sudo docker commit 容器名称 镜像名称
# 备份镜像为tar文件
$sudo docker save -o 文件名.tar|文件名.tar.gz 镜像名 # 保存到当前目录下
# 从tar文件中恢复镜像
$sudo docker load -i 文件名.tar
注意:同一个主机中,不能有两个同名的镜像
使用Docker时,想要获得一个镜像,可以从Docker仓库中进行下载,或者使用镜像备份后的tar文件。还可以自己根据需求制作新的镜像。
Dockerfile就是用于制作新镜像的。
Dockerfile其实是一个文本文件,由一系列命令和参数构成,Docker可以读取Dockerfile文件并根据Dockerfile文件的内容来构建新镜像。
Dockerfile文件内容一般分为4部分:
Dockerfile常用命令
基于基础镜像制作新镜像,新镜像中会包含有其他一些应用,如jdk,tomcat等。
示例:
以镜像 centos:7
为基础镜像,添加jdk1.8的应用,构建一个包含jdk1.8的centos7新镜像,取名为 jdk1.8-centos7
。
这个取名是有讲究的:
(取名规则,借鉴Java中类的命名,前面是修饰,最后才是类的根本,如
MessageListener
) 分段命名,中划线分隔。
比如上面这个“jdk1.8-centos7”: 其根本上是一个centos7系统,但是这个系统有包含有jdk1.8。
注意:要添加到基础镜像中的jdk1.8应用,是一个jdk1.8的tar包,不是一个jdk1.8容器或镜像。
# 1、宿主机中创建目录
$ sudo mkdir -p /usr/local/jdk1.8-centos7
$ cd /usr/local/jdk1.8-centos7
# 2、上传 jdk-8u221-linux-x64.tar.gz 文件到宿主机的/usr/local/jdk1.8-centos7目录
# jdk安装包注意一定要是linux 64位的,oracle官方上下载即可
# 3、在 /usr/local/jdk1.8-centos7 目录下创建Dockerfile文件
$ sudo vim Dockerfile
# Dockerfile文件内容如下:(环境变量中各个属性的值,得根据自己用的jdk安装包版本来写)
FROM centos:7
MAINTAINER yeats
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
# 4、执行命令构建镜像;不要忘了后面的那个 .
$ sudo docker build -t='jdk1.8-centos7' . # 最后那个点,表示“当前目录”,即将构建的新镜像存放到当前目录
# 5、查看镜像是否建立完成
$ sudo docker images
(1)ADD jdk-8u221-linux-x64.tar.gz /usr/local/java/
将jdk安装到
/usr/local
下没什么说的,Linux中建议用户安装的软件都放到该目录下。但安装到java
目录下,这是windows中jdk默认安装的目录C:\Program Files\Java\jdk1.8.0_144
(2)ENV JAVA_HOME /usr/local/java/jdk1.8.0_221
怎么知道jdk压缩包解压后的目录是
jdk1.8.0_221
的?去解压一下看看就可以了(3)WORKDIR /usr
WORKDIR 工作目录。 指一进入容器,默认进入到的目录。
执行构建命令,会根据Dokcerfile文件的内容,一行一行执行(一行命令就是一个执行步骤):
jdk1.8-centos7
容器中查看jdk版本时,java -version
命令是执行不了的,会报错。使用上面制作的新镜像jdk1.8-centos7
,创建容器
基础镜像是
centos:7
,创建出来的容器,严格意义上讲,它是centos容器,但这是个安装了jdk1.8的centos容器。
# 查询宿主机现有镜像
$ sudo docker images
# 使用新镜像jdk1.8-centos7,创建守护式容器
$ sudo docker run -di --name=jdk1.8-centos7 jdk1.8-centos7
# 查看正在运行的容器,是否有jdk1.8-centos7
$ sudo docker ps
# 启动并进入容器
$ sudo docker exec -it jdk1.8-centos7 /bin/bash
# 一进入到容器,就会进入到其“工作目录”,即Dockerfile文件中配置的“WORKDIR”值
# 在jdk1.8-centos7容器中查询jdk版本号
$ java -version
QQQQ:Dockerfile文件如何编写,去为centos基础镜像中添加更多的应用程序呢?
Docker官方的Docker hub(https://hub.docker.com)是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望将自己的镜像放到公网当中,总之,你想建立一个私有镜像仓库,那么我们就可以来搭建自己的私有仓库,用于存储和管理自己经常使用的镜像。
私有镜像仓库,本质上也是一个Docker容器,Docker官方为此提供了一个仓库镜像:registry
。因此,要使用私有镜像仓库,首先就是去获取这个仓库镜像
,并使用它建立一个镜像仓库容器
。
# 1、拉取私有仓库镜像
docker pull registry
# 2、启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
# 3、打开浏览器 输入地址http://宿主机ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库
搭建成功
# 4、修改daemon.json
vi /etc/docker/daemon.json
# 在上述文件中添加一个key,保存退出。此步用于让 docker 信任私有仓库地址;注意将宿主机ip修改为自己宿主
机真实ip
{"insecure-registries":["宿主机ip:5000"]}
# 5、重启docker 服务
systemctl restart docker
docker start registr
# 0、查看当前宿主机的镜像
$ sudo docker images
# 1、标记某个镜像为私有仓库的镜像
# 例如:将自己创建的 jdk1.8-centos7 标记为私有仓库镜像
$ sudo docker tag jdk1.8-centos7 宿主机IP:5000/jdk1.8-centos7
$ sudo docker tag jdk1.8-centos7 192.168.178.151:5000/jdk1.8-centos7
# 2、再次启动私有仓库容器
docker restart registry
# 3、上传标记的镜像
docker push 宿主机IP:5000/jdk1.8
# 4、输入网址查看仓库效果
`http://192.168.178.151:5000/v2/_catalog`
分为两种情况:
从本地私有镜像仓库拉取镜像
也就是从自己主机上配置的私有镜像仓库中拉取镜像
----实践中,这种情况不多。通常是自己个人的需要,制作了新的镜像留存再用。
从其他服务器上的私有镜像仓库拉取镜像
----实践中,这是更常见的。比如从公司的私服上拉取镜像到自己的电脑上来用。
直接执行如下命令:
# 私有仓库所在的服务器上如果已经存在相关镜像,要先删除(指定镜像名删除,不是指定id)。而且该镜像不能已经被其他容器所关联(有存在的容器是使用该镜像创建的容器)
$ sudo docker rmi 服务器ip:5000/jdk1.8-centos7
#拉取镜像
$ sudo docker pull 服务器ip:5000/jdk1.8-centos7
#可以通过如下命令查看 docker 的信息;了解到私有仓库地址
$ sudo docker info
大多数情况下,都是在一台A服务器部上署了私有镜像仓库之后,其它服务器从A服务器上的私有镜像仓库中拉取镜像。
若要拉取私有仓库镜像,需要去修改本机docker的配置文件,设置启动时候的仓库地址。
这里所说的docker配置文件在哪里?
/usr/lib/systemd/system/docker.service
文件,这是Docker的安装文件
# 打开docker配置文件(建议使用EditPlus去编辑Linux的配置文件)
vi /usr/lib/systemd/system/docker.service # 使用命令去编辑,需要在root用户权限下
# 按下图,去添加如下的内容(注意修改下面内容中的ip地址为自己当前所用的宿主机IP)
--add-registry=192.168.178.151:5000 --insecure-registry=192.168.178.151:5000 \ # 最后反斜杠莫丢
# 修改完后需要重新加载docker配置文件并重启docker
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
反斜杠表示,内容都是属于ExecStart,但是换一行显示。
然后,就可以直接从其他服务器上的私有镜像仓库拉取镜像,像从本地私有仓库或公有镜像仓库去拉取镜像一样。
# 拉取镜像
$ sudo docker pull jdk1.8-centos7 # 不需要再写成`docker pull IP:端口/jdk1.8-centos7`
# 查看镜像
$ sudo docker images