目录
Docker
官网:https://www.docker.com/
docker:翻译过来就是容器。“一次封装,到处运行”,docker解决了应用环境的问题,安装了docker的平台就能跑“docker包”。
- dockerfile:自动化脚本,用来创建下面讲到的镜像
- image:镜像,可以理解成一个虚拟机的快照,里面包含了你要部署的应用程序以及关联的所有库,
- container:(容器),通过镜像我们可以创建许多不同的container容器,每个容器是独立运行的,相互之间不影响。(通俗的说,镜像运行起来就是容器)
- repository:仓库,存放镜像的地方,分为共有仓库和私有仓库。
官方文档:https://docs.docker.com/get-started/overview/
安装Docker
# 需要的安装包
yum install -y yum-utils
# 设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认是国外的,速度慢
# 推荐使用阿里云的
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新软件包的索引
yum makecache fast
# 安装docker相关
yum install -y docker-ce docker-ce-cli containerd.io
# 启动docker
systemctl start docker
# 查看是否安装成功
docker version
# hello world
docker run hello-world
# 查看docker下载的镜像
docker images
卸载docker:
# 1、卸载 Docker 引擎、CLI 和 Containerd 软件包:
yum remove docker-ce docker-ce-cli containerd.io
# 2、映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷:
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
阿里云镜像加速:
把指令copy过来直接执行就ok了…
Docker常用命令
官方帮助文档地址:https://docs.docker.com/reference/
docker version # docker 版本信息
docker info # 显示docker的系统信息,包括镜像和容器
镜像命令
docker images
查看镜像
[root@192 /]# docker images
# 镜像的仓库源 镜像标签 镜像id 镜像创建时间 镜像大小
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 5 months ago 13.3kB
#可选项
--quiet,-q 仅显示镜像 ID
docker search
搜索镜像
dockerHub(直接在web端搜索):https://hub.docker.com/
[root@192 /]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12241 [OK]
mariadb MariaDB Server is a high performing open sou… 4702 [OK]
#....省略其他搜索结果
docker pull
下载镜像
[root@192 /]# docker pull mysql # docker pull 镜像名[:tag]
Using default tag: latest # 如果没有写tag,默认就是latest(最新)版本
latest: Pulling from library/mysql
72a69066d2fe: Pull complete # 分层下载
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
688ba7d5c01a: Pull complete
00e060b6d11d: Pull complete
1c04857f594f: Pull complete
4d7cfa90e6ea: Pull complete
e0431212d27d: Pull complete
Digest: sha256:e9027fe4d91c0153429607251656806cc784e914937271037f7738bd5b8e7709 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址,等价于docker pull mysql
# 指定版本下载
docker pull mysql:5.7
docker rmi
删除镜像(rmi:remove image)
# 将指定镜像id的镜像删除(删除多个,镜像id使用空格分隔)
[root@192 /]# docker rmi -f 3218b38490ce
#删除所有的镜像(将查询出来的所有镜像的id作为删除镜像操作的参数)
[root@192 /]# docker rmi -f $(docker images -q)
容器命令
docker run
新建容器并重启
docker run [可选参数] image
# 参数说明
--name="Name" 容器名称
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口 -p 主机端口:容器端口
-P 随机指定端口
**docker ps **查看所有运行的容器
[root@192 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@192 /]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aba8c900e216 centos "/bin/bash" 2 minutes ago Exited (0) About a minute ago serene_booth
4aa79acb5775 feb5d9fea6a5 "/hello" 2 hours ago Exited (0) 2 hours ago exciting_greider
fac0186fcf99 feb5d9fea6a5 "/hello" 7 hours ago Exited (0) 7 hours ago jolly_edison
参数:
-a # 列出当前正在运行的容器+历史运行过的容器
-n=? # 最近运行的容器,只列出n个,例如 -n=1
-q # 只显示容器的编号
退出容器
exit # 容器停止并退出
ctrl键 + Q键 + P键 #容器不停止退出
docker rm
删除容器
# 删除指定容器id的容器
docker rm 容器id
# 删除全部的容器也是一样的道理,-f可以删除正在运行的容器
docker rm -f $(docker ps -aq)
# 查询出所有的容器的id作为参数,进行docker容器的删除
docker ps -a -q|xargs docker rm
启动和停止容器的操作
docker start 容器id # 启动容器
docker restart 容器id # 重启容器
docker stop 容器id # 停止当前正在运行的容器
docker kill 容器id # 强制停止当前容器
查看日志:
docker logs -f -t -n 10 容器id或者容器名称
参数:
--follow,-f 关注日志输出
--timestamps,-t 显示时间戳
--tail,-n 从日志末尾显示的行数
进入容器:
docker exec # 进入容器后开启一个新的终端,可以进行操作(常用)
[root@192 admin]# docker exec -it b27468ee7f62 bin/bash
[root@b27468ee7f62 /]# exit # 或者 ctrl+p+q 不停止容器退出
docker attach 容器id # 进入容器正在执行的终端
查看容器的详细信息:
docker inspect 容器id
复制容器文件到主机中:
docker cp 容器id:容器文件地址 主机
[root@192 admin]# cd /home/
[root@192 home]# ll
total 4
drwx------. 16 admin admin 4096 Mar 12 20:52 admin # 原本home中只有这一个文件夹
[root@192 home]# docker exec -it b27468ee7f62 bin/bash # 进入容器
[root@b27468ee7f62 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@b27468ee7f62 /]# cd home/
[root@b27468ee7f62 home]# ls
[root@b27468ee7f62 home]# touch test.java # 创建一个文件
[root@b27468ee7f62 home]# ls
test.java
[root@b27468ee7f62 home]# exit
exit
[root@192 home]# docker cp b27468ee7f62:/home/test.java /home # 复制操作
[root@192 home]# ls
admin test.java
容器数据卷
如果我们都在容器中,容器一删除,我们的数据就被删除了,所以我们需要将数据持久化
容器之间可以有一个数据共享的技术,就是我们的容器数据卷。
容器中产生的数据同步到本地,这就是卷技术,目录的挂载,将我们的容器内的目录,挂载到Linux上面。
# 命令
# -v linux目录:容器内目录
[root@192 admin]# docker run -it -p 3366:8080 -v /home/ceshi:/webapps --name="tomcat02" tomcat_my:1.0 /bin/bash
容器删除后,linux挂载的卷数据还在。
挂载的时候如果没有指明卷的绝对地址,或者直接没有指定卷的地址(:的左边),卷都会在
/var/lib/docker/volumes/xxxx/_data
,直接没有指定卷的地址这种方式也被称为
匿名挂载
没有指明卷的绝对地址(:左边的值不是以/开头),,这种方式称为
具名挂载
而我们演示的例子中指定了卷的绝对地址,这种方式称为
指定路径挂载
,方便查看卷,平时这种方式使用更多
拓展:
# 通过 -v 容器内路径:ro rw 改变读写权限
ro readonly # 只读,说明这个路径只能通过宿主机来操作,容器内无法操作
rw read write # 可读可写
docker run -d -P --name nginx02 -v jvming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v jvming-nginx:/etc/nginx:rw nginx
数据卷容器
让两个容器实现数据同步
例子:多个mysql实现数据共享
# 命令 --volumes-from
# 运行第一个容器
[root@192 ceshi]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name="mysql01" mysql:5.7
# 运行第二个容器
[root@192 ceshi]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name="mysql02" --volumes-from mysql01 mysql:5.7
# 这个时候,可以实现两个容器数据同步,生命周期一直到没有容器使用为之
案例
安装Tomcat
# 官方推荐方式,测试使用,停止后就会直接删除
docker run -it --rm tomcat:9.0
# 直接下载并启动tomcat
docker run -it tomcat:9.0
# 1、启动镜像,并开启指定端口映射
[root@192 admin]# docker run -d --name tomcat01 -p 3355:8080 tomcat:9.0
# 顺带挂载数据卷
# 莫名 -it 来启动有问题
# 然后 -d 启动的话就不可以用 docker attach 来进入容器了,而要使用 docker exec -it 容器id bash 来进入容器
[root@192 ~]# docker run -d --name love -v /home/love:/usr/local/tomcat/webapps/love -p 520:8080 tomcat:9.0
# 2、外部访问测试(发现404报错,进入tomcat中的webapps目录下,发现里面并没有任何内容)
# http://192.168.245.129:3355/
# 而webapps.dist中有我们平时使用的内容,拷贝webapps.dist的所有内容的webapps中
cp -r webapps.dist/* webapps
# 3、访问测试
附:使用
ifconfig
命令,查看主机ip(ens33中)
安装MySQL
# 获取镜像
[root@192 home]# docker pull mysql:5.7
# 运行镜像的时候做数据挂载,指定端口映射
[root@192 ceshi]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name="mysql01" mysql:5.7
# 使用navicat连接测试...
使用navicat连接成功后,我们尝试创建一个数据库test
在挂载在linux的home/mysql/data目录中就可以看到我们刚刚创建的数据库了
commit镜像
对一个镜像进行修改的时候,系统在镜像之上又起了一层“容器层”
如果想要保存当前容器的状态,就可以通过commit来提交,获得一个镜像。
docker commit 提交容器成为一个新的镜像
# 命令
docker commit -m="提交描述信息" -a="作者" 容器id 目标镜像名:[TAG]
# 示例 提交之后我们就可以看到我们提价之后形成的镜像了
[root@192 admin]# docker commit -m="my tomcat" -a="tianyi" 7055953d1f8e tomcat_my:1.0
sha256:c744a31c1515bcbfa6e8f4d5d99b0692c450bd5df05da4c6038b56b015608316
[root@192 admin]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat_my 1.0 c744a31c1515 6 seconds ago 685MB
tomcat 9.0 b8e65a4d736d 2 months ago 680MB
centos latest 5d0da3dc9764 6 months ago 231MB
[root@192 admin]#
shell脚本方式安装
编写脚本,直接运行脚本,一键式安装
1、docker安装脚本
docker_install.sh
#!/bin/bash
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
#安装docker-compose
#curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
#启动docker服务
systemctl start docker
docker run hello-world
编写好脚本之后,直接运行脚本,例如:
#执行shell脚本的三种方式
. docker_install.sh
./xxx.sh
bash xxx.sh