docker镜像与docker容器
docker镜像与docker容器
镜像与容器的关系
镜像:(例如系统安装镜像)
已经装好环境的虚拟机(运行一次 就是一个容器(新的操作系统))
! 当作是容器的 ”源代码“
如同面向对象中的类
容器: (装好的系统)
一个一个的操作系统,或者是已经装好东西的系统
如同面向对象的对象
镜像
修改docker 镜像源
docker-ce | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
镜像相关命令
docker search 包名 # 搜索包 一般都是去hub.docker.com
# docker search python # 搜索一个只是装好了python的环境
docker pull 包名
# docker pull cento # 直接下载最新版
# docker pull centos:7 # 通过: 指定版本
docker images # 查看已经下载的镜像
# 删除(用的比较少) 除了通过镜像id删除,也可以通过名字删除
# 如果镜像已经有容器了,那就不能(该)删除,(不管容器是否是启动的)
docker rmi 镜像id # 删除镜像 # 镜像id可以只输入前三位
docker rmi `docker images -q` # 删除所有的镜像
关于搜索镜像
其实不怎么建议使用docker search ,更建议直接去hub.docker搜索
容器
容器命令
镜像跑起来就是容器了
docker ps # 查看运行中的容器
# 默认是查看运行中的容器
-a 查看所有容器(不管你有没有运行)
-l 查看最后一次运行的容器
-f status=exited 查看停止的容器
启动容器(创建)(基于images):
docker run
# docker run -id --name 自己取得的容器名 镜像名() /bin/bash
# # docker run -di --name=mysql8 c0cdc95609f1 /bin/bash
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
--name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
来自 <https://www.cnblogs.com/xiaoyuanqujing/articles/11774978.html>
启动容器(已经有了的容器)
docker start 容器id/名字
停止容器
docker stop 容器id/名字
重启容器
docker restart 容器id/名字
进入容器内部
docker exec -it 容器id/名字 /bin/bash
docker exec -it 容器id/名字 sh # 如果上面的办法不行,就用这个办法
退出容器内部
exit
删除容器
docker rm 容器名字/id # 正在运行的容器不能删除
容器拷贝
向里面拷贝:
# 宿主机>容器
docker cp 需要拷贝的文件或目录 容器名称:容器目录
来自 <https://www.cnblogs.com/xiaoyuanqujing/articles/11774978.html>
向外面拷贝:
# 容器> 宿主机
docker cp 容器名称:容器目录 需要拷贝的文件或目录
来自 <https://www.cnblogs.com/xiaoyuanqujing/articles/11774978.html>
目录映射(挂载)
目录映射(挂载)
docker run -di -v 宿主机路径:内部路径 --name=新容器名 镜像名
# docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
# 如果创建的时候是 it 而不是id,那么它会自动进去,然后推出来的时候就会自动关闭
查看容器的ip详细信息(例如查看ip)
查看容器ip地址
docker inspect 容器名字/id
# 会有一堆resft接口(json 格式)
# 我们自需要去看他的IP地址
# 这个方法是单看ip地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
举例(安装一个mysql的容器,然后把3306端口映射出来)
# 安装mysql的容器(如果本地没有镜像,他会自动去网上下载)
docker run --name=sqls8 --restart on-failure -d mysql/mysql-server:8.0
# 此方法来自mysql官方的docker指引教程(https://dev.mysql.com/doc/refman/8.0/en/docker-mysql-getting-started.html)
# 启动mysql容器服务
docker start sql8
# 查看mysql的初始root密码(mysql8.0会自动随机分配)
docker logs sqls8 2>&1 | grep GENERATED # windows没有自带grep命令,建议换成findstr 或者就直接使用docker logs sqls8 2>&1 然后ctrl + f 手动查找 GENERATED
# 下面那一坨就是mysql的默认密码了,拿到密码我们就可以在外部进行连接了(到这里我就不演示了,因为目的已经达到了)
如果想要自己开始就设置密码的话,创建容器的命令就应该是:
docker run -id -p 3306:3306 --name=sql8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql
反打包
容器 打包为 镜像,然后把镜像打包为镜像文件
然后通过镜像生成更多容器,或者把镜像文件拷贝给别人用(文件会比较大)
打包 容器->镜像->镜像文件
# 容器-> 镜像
docker commit 容器名字 镜像名字
# docker commit sql8 sql8_1
# 镜像-> 镜像文件
docker save -o 压缩后文件名 镜像名字
# docker save -o sql8_1.tar sql8_1
# 打包好后,就可以直接拷贝给别人用了
解包 镜像文件->镜像
# 镜像文件->镜像
docker load -i 文件名
# docker load -i .\sql8_1.tar
镜像文件-> 容器 我这就不说了, 上面有…… 容器