- Docker
- 安装Docker
- 阿里云镜像加速:
- Docker常用命令
- 镜像命令
- 容器命令
- 容器数据卷
- 数据卷容器
- 案例
- 安装Tomcat
- 安装MySQL
- commit镜像
官网: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了…
官方帮助文档地址: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来提交,获得一个镜像。
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]#



