| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> Docker入门(二) -> 正文阅读 |
|
[系统运维]Docker入门(二) |
目录 1. 前提:Docker与容器的数据交互方式(1)文件拷贝:docker cp(2)数据卷:docker volumes(3)挂载:docker mounts2. docker cp 复制(1)把容器外的内容传到容器里docker cp 源路径/文件名 容器名:绝对路径? (注意:这里必须是绝对路径,容器里的) (2)把容器里的内容导出容器外docker cp 容器名:绝对路/文件名 目的路径/文件名 ? (不指定目的路径的话,拷贝出来的文件就放到容器外当前所在的路径,即实行docker时的当下路径) (3)延伸:如何修改端口 9090:8080修改映射端口9090 ? 销毁当前容器,重新起一个容器(无法在一个已经定义端口的容器的状态下去修改外面的端口) 修改镜像?容器端口8080? 失败: 进到容器里(exec),cd bin, sh shutdown.sh 不能这样,这样会销毁掉。容器还在,只是没起? 成功: 1)重启: docker start 容器名或者容器id 2)进容器,找端口的配置文件:cd conf/ ,修改端口号:vim server.xml(包含端口信息) 3)此时发现2)不成功,因为容器里没有vim命令。 怎么处理?cp server.xml到容器外,修改好之后,再cp回容器里 conf/ 路径下,会覆盖原来的 以上,只是修改了该容器的端口,要是从镜像中再起一个容器,端口就还是原来的,未受更改影响。若要使镜像也变,就涉及到 commit了 3. docker commit 提交更新1)在容器中更新好信息之后,退出容器 2)#docker commit -m "描述更改的句子,随意定" 容器id 镜像名:tag名 ? (最后这个,将会是生成的新镜像的名称和tag) docker commit -a "runoob.com" -m "my apache" a404c6c174a2? mymysql:v1 3)用 docker images查看是否已经生成一个新的镜像,镜像名称和tag在2)中定义了 4)用新镜像来启动一个新的容器,然后在新容器里,是不是有上面旧容器做的更改 docker run -itd - -name "新容器名" -p 9091:8888 镜像名:tag名? ? (镜像名和tag名是上面新生成的,8888是新的端口) 小结:在容器内部的任何操作,都不影响镜像本身。要把操作和更改固化,需要用commit。 4. docker inspect 查看容器或镜像的详情docker inspect 容器id 比如挂载内容,挂载的类型(Mounts:[ ])等等 docker inspect 镜像id 比如可以获取环境变量等信息 练习一1)自己修改tomcat镜像,要求把tomcat启动端口改成8888并启动容器 思路:据tomcat原始镜像启动一个tomcat容器 使用docker cp把 server.xml 复制出来,修改端口成8888 --> 把修改后的server.xml cp回去 --> 使用docker commit生成新的镜像 --> 使用新镜像启动容器 2)为什么Docker镜像的修改要这么麻烦? docker 是一种服务,为了保护服务器的稳定性。不支持很多命令和操作,即不允许直接在容器上修改一些东西,为了保证服务器的统一。所以把一些操作做得很复杂。 5. docker volume 数据卷5.1 数据卷特点1)数据卷存在于宿主机的文件系统中,独立于容器,和容器的生命周期是分离的 2)数据卷可以是目录也可以是文件,容器可以利用数据卷与宿主机进行数据共享,实现了容器间的数据共享和交换 3)容器启动初始化时,如果容器使用的镜像包含了数据,这些数据会拷贝到数据卷中 4)容器对数据卷的修改是实时进行的 5)数据卷的变化不会影响镜像的更新。数据卷是独立于联合文件系统,镜像是基于联合文件系统。镜像和数据卷之间不会相互影响。 练习二启动mysql镜像: docker pull mysql docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PATHWORD=123456 mysql docker exec -it mysql-test /bin/bash mysql -u root -p ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456' 哪儿查环境变量:docker inspect mysql | grep 'MYSQL_ROOT_PASSWORD' 先登录root然后再授权:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; 思考:如何确保mysql的业务数据不丢失?---用数据卷 练习三使用数据卷来实时更新mysql 1)创建数据卷 docker volume create --name 数据卷名称(自定义) 2)启动mysql容器,使用数据卷 docker run -itd --name mysql-test -p 3306:3306 -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql mysql_data是上面创建的数据卷名称 /var/lib/mysql 是容器中的路径 3)进入容器,授权(不授权的话,外部客户端无法访问,需要在容器里手动敲命令。所以,授权客户端来操作表格,比较方便) docker exec -it mysql-test /bin/bash mysql -u root -p ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456' 4)在客户端远程访问,创建库和表 5)删除容器,用数据卷重新创建一个新容器 ???多个容器共用同一个数据卷,这样当第二个容器尝试使用数据卷时,失败。因为数据卷被占用了。 ??? 先把其他容器都stop, rm掉。再手动的起一个新的容器。 6)验证看看之前在数据卷中更新的信息,是否体现在新容器里 mysql -u root -p use test ? (test是数据库名) 练习四使用数据卷来练习tomcat 1) docker volume create webapps_volume 2) cd /var/lib/docker/volumes/webapps_volume ? ? (!!这是存放数据卷的位置) mkdir file cd / cp ca.txt /var/lib/docker/volumes/webapps_volume/file/ 3)docker run -itd -p 8080:8080 -v webapps_volume:/usr/local/tomcat/webapps/ --name=ckl_tomcat02 tomcat 4) cd /var/lib/docker/volumes/webapps_volume/ ? (该目录下有_data目录和file目录) cd file cp ca.txt ../_data/? ? (建一个数据卷,数据默认放在_data目录下) 5) 再起一个容器:docker run -itd -p 8081:8080 -v webapps_volume:/usr/local/tomcat/webapps/ --name=ckl_tomcat04 tomcat 在两个会话中起来上面两个容器,更新一边,从另一边看看是否有同步更新。 两边数据时互通的,共享的 容器消失后,数据卷和数据都还是存在的,可供后续的容器使用。 问题补充 不新建数据卷,在run启动容器时,加 -v 参数,则自动创建数据卷。 起来之后,进var/lib/docker/volumes/下看看是不是有新的数据卷 22,80,443, 等都是高危端口,云服务时是使用受限的,需要开防火墙 rm 删容器, rmi 删镜像。有容器依赖的镜像 删不掉。 6. docker mount 挂载(1)run的时候,若-v带的是文件夹,比如 -v /root/ckl_001: /usr/local/tomcat/webapps 此时,也能创建成功。再进去 /var/lib/docker/volumes 没看到数据卷,因为这种方式,其实是实现了挂载,而非数据卷 (2)运维的角度,更建议用数据卷,便于将所有数据放到同一个地方 (3)bind mount 和 volume的对比 Source位置: 用户指定 vs /var/lib/docker/volumes/ Source为空:覆盖dest为空 vs 保留dest内容 Source非空:覆盖dest内容 vs 覆盖dest内容 Source种类:文件或目录 vs 只能是目录 可移植性:一般(自行维护)vs 强(docker托管) 宿主直接访问:容易(仅需chown)vs 受限(需登录root用户) |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 11:36:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |