
前言
刚看别人使用Docker的时候有很多不解,为什么要用Docker,Docker怎么用?Docker配置为什么这么难?为什么网络访问不通?等等因素阻碍了笔者学习Docker?
基本命令
下载镜像
# 以redis为例子
docker pull redis
运行镜像
docker run \
-d \ # 后台运行
--name redis6 \ # 自定义名字
-p 6379:6379 \ # 端口映射
redis # 镜像名称
docker run -d --name redis6 -p 6379:6379 redis redis-server --appendonly yes --requirepass "123456" # 完整命令
进入容器
第一种(不推荐,当退出容器使用exit命令时,会停止这个容器)
docker attach 容器id
第二种
docker exec -it 容器id bin/bash
暂停容器
docker stop 容器id
启动容器
docker start 容器id
查询容器列表
docker ps -a # 查看所有容器
docker ps # 查看运行中的容器
run和start的区别:
run是创建一个新的容器 start是把已经创建好的容器启动
查看容器信息
docker inspect 容器id
挂载
挂载介绍
容器里面的文件都是在容器内部,而跟你当前电脑是没有关系的,如果删除了容器怎么办?但是资料又想保存就像mysql一样,我只是换一台电脑就要把整个容器复制过去,太麻烦了!所以需要把容器的文件跟当前主机文件作为一个映射
命令教程
参数-v 宿主机路径:容器路径
# 以mysql为例子
docker run -d --name mysql8 -p 3306:3306 -v /data/mysql8/config:/etc/mysql/conf.d -v /data/mysql8/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql
# 以上的命令可以参考https://hub.docker.com/_/mysql里面有详细介绍
为什么有知道这么多路径或者参数
每个中间件或者一个数据库容器,他可能需要有很多配置,例如密码,持久化文件的路径等等。那我们怎么知道路径是什么
可以进hub.docker.com找到自己需要的容器然后看文档 进容器找了(这个方法有点笨。笔者一开始就是这么找到的。)
网络
容器之间怎么进行通讯
容器虽然是能相互通讯的,但是容器每次重启ip都跟上一次不一样,所以这样通讯会很复杂
示范
# 先拉个centos镜像下来
docker pull centos
# 创建个容器
docker run -d -it --name centos1 centos
docker run -d -it --name centos2 centos
docker inspect centos1_id
截取一些容器信息下来
[
{
"NetworkSettings": {
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "9e7ed6d29ca3474de04409833e39b7c7965c7c63d3a1f509886a7a998e4825f8",
"EndpointID": "41230bf523fac8fa4933989d98baaaa7655fba5c5dadd14e63839ffe868ed3f8",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.4",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:04",
"DriverOpts": null
}
}
}
}
]
docker inspect centos2_id
[
{
"NetworkSettings": {
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "9e7ed6d29ca3474de04409833e39b7c7965c7c63d3a1f509886a7a998e4825f8",
"EndpointID": "8ae77d46887c795983ee7a8fb96951d05e236b4ca4b4caa5d5964f892e18a476",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.5",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:05",
"DriverOpts": null
}
}
}
}
]
以上centos1 ip为172.17.0.4 以上centos2 ip为172.17.0.5
解决问题
docker network create centos-network
docker run -d -it --network centos-network --name centos3 centos
docker run -d -it --network centos-network --name centos4 centos
docker exec -it centos3_id /bin/bash
ping centos4
# 所以当创建了一个network后 容器都能加入到这个网络里面,很方便
这样就可以解决每次容器重启后ip不一致问题。
总结
其实在刚使用容器的时候会很麻烦
不知道docker的命令和容器需要的参数 每次都要上官网找下有什么参数或者百度
但相比每次下载文件下来,进去配置省很多力气,并且配置一次保存好用过的命令,以后都可以用了,不需要再重复去改很多东西
其实在一些小型公司,没有专业的运维的话尽量不要在生产环境上使用docker,不然真的出现问题的话会很头疼,不仅仅要维护项目,还要维护docker。
原文地址:https://juejin.cn/post/6974427129748389902
推荐阅读
SpringBoot常用注解速查,一键收藏了~ 建议收藏 | Linux 命令汇总 再有人面试问你 Redis 分布式锁的实现,把这篇文章甩给他
Java 100+ 经典面试题大全&答案,剑指名企Offer ! MySQL 分库分表,写得太好了!
揭秘在使用多线程时为什么会带来性能问题? 关于wait/notify/notifyAll 方法的使用注意事项 都是线程安全,ConcurrentHashMap和Hashtable有什么区别? 实际工作中可能会遇到三类线程安全问题
干货分享
关注码上Java ,回复关键字面试宝典,领取一份嘟嘟平时收集的一些优质资源,包含咱们代码侠必备的优质简历模板、面试题库、电子书等资源大礼包一份(持续更新优质资源哦~),助力小伙伴们早日收获心仪offer,遇见更好的自己~
文章转载自码上Java,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




