镜像与容器docker
镜像(从仓库中获取):把app和依赖打包一起(是一种静态文件)
公开仓库:hub.docker(官方)
私有仓库:公司内部的仓库
容器:把镜像运行起来
容器运行池看作货运船,镜像看作集装箱
拉取镜像
所有对容器的操作都要在root下执行
切换到root用户命令:su
拉取镜像:
shell
docker pull nginx[:tag]
docker pull xxx/product
层次结构
在root用户下输入:
shell
# 拉取最新版本:
docker pull nginx
# 或者
# 拉取稳定版本:
docker pull nginx:stable
**拉取时采用层次结构:**先拉取最新版,再拉取稳定版,发现有的已经存在的没有下载
不会下载重读的
镜像相关操作
shell
docker images # 列出所有的镜像
docker rmi [REPOSITORY] # 删除镜像
根据镜像启动容器
docker run [镜像的名字]
docker run nginx
查看正在运行的容器
在另一个窗口使用命令查看
shell
docker ps
第一项:容器的id 哈希值
第二项:容器的名字
第三项:容器入口所执行的命令 相当于开了一个虚拟的小的操作系统,启动nginx
第四项:创建时间
第五项:当前状态,运行了多少秒
第六项:容器占用的网络端口80(不是宿主机的网络端口)
第七项:随机的容器名
查看已经退出的容器
这时候在容器中什么都做不了,使用ctrl+c退出容器
此时不仅退出了容器,容器也停了
在第二个窗口输入命令列出已经退出(停掉)的容器
docker ps -a
删除已经退出的容器
删除已经退出(停止)的容器
shell
docker rm [NAMES]
# 或者
docker rm [CONTAINER ID]
后台启动容器
刚才的容器存在问题,按ctrl+c容器直接退出(关闭停止)
docker run --help
列出帮助手册
以分离的方式启动容器:后台启动容器
-d, --detach Run container in background and print container ID
shell
docker run -d nginx
前台启动容器&操作容器内容
容器------虚拟机
操作容器内容------shell/命令行解释器
-i, --interactive Keep STDIN open even if not attached
-t, --tty Allocate a pseudo-TTY
shell
docker run -it nginx /bin/bash
-it 将键盘接入到容器中
/bin/bash 容器去执行bash
离开容器(容器还在运行)
ctrl+p,q
进入正在运行的容器内部
docker exec -it [NAMES] /bin/bash
容器的关机、开机
docker stop [NAMES] 关机,停止正在运行的容器(ctrl+c)
docker start [NAMES] 开机,运行已经停止的容器
建立宿主机和容器的端口映射
-p, --publish list Publish a container's port(s) to the host 把容器的端口暴露给宿主机
shell
docker run -d -p [port]:80 nginx
宿主机的port端口对应容器的80端口
第一个端口时宿主机的端口,第二个端口是容器的端口
这样容器就可以做服务端,外部网络就可以访问容器
这个网页是容器 提供的,可以进入容器的/usr/share/nginx/html
文件加中更改index.html
文件的内容来更改页面的显示
有了映射机制,docker就可以作为服务端了
自己制作镜像
- 创建一个容器
- 进入容器做修改 ,例如修改index.html文件(保存在文件DOCKERFILE中)
- 拷贝代码&修改配置文件
- 编译
- 启动进程
- 打包
shell
root@DESKTOP-S2IEPFK:/home/caoxu# docker commit --help
Usage: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
Create a new image from a container's changes
Aliases:
docker container commit, docker commit
Options:
-a, --author string Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
-c, --change list Apply Dockerfile instruction to the created image
-m, --message string Commit message
-p, --pause Pause container during commit (default true)
shell
# 从一个容器中生成一个镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit 容器的名字 镜像的名字:标签名字
shell
docker commit vigorous_hofstadter nginx:niqiu54 #打包镜像
docker images # 查看打包好的镜像
docker run -d nginx:niqiu54 #启动
#ctrl+p,q先退出来
docker ps #查看一下
docker exec -it confident_habit /bin/bash #再重新进去
cat /usr/share/nginx/html/index.html #看一眼是打包之前修改过的吗?是
容器的修改可以持久化(影响磁盘)
将容器的文件系统,映射到主机,对容器的修改等价于对宿主机的修改,容器挂了,宿主机还在,实现持久化
挂载:
在容器中按照容器的方式访问,可以通过/dir1/file1访问
在宿主机中可以按宿主机的方式访问,通过/A/B/dir/file访问
文件系统的挂载机制
操作系统存在一个虚拟文件系统,把物理文件系统变成一个树结构
买回来的硬盘要先格式化(放一个文件系统进去)
挂载
接入一个新的子树(u盘的物理文件系统改成虚拟文件系统),使之使用起来像是宿主机虚拟文件系统中的一部分
容器的持久化(建立文件的映射)
-v, --volume list Bind mount a volume 挂载一个卷
宿主机的一个路径对应容器中的一个路径,相当于将容器的路径作为一个子树接入到宿主机中
root@DESKTOP-S2IEPFK:/home/caoxu/myGitWarehouse/my-git/HTTP/20240421_day07/test# docker run -d -p 8889:80 -v /home/caoxu/myGitWarehouse/my-git/HTTP/20240421_day07/test:/usr/share/nginx/html nginx
然后在宿主机中修改文件的内容:
root@DESKTOP-S2IEPFK:/home/caoxu/myGitWarehouse/my-git/HTTP/20240421_day07/test# echo -n "<html>word</html>" > index.html
然后新开一个界面进入容器,容器中有内容了
root@6912add58ffc:/# cat /usr/share/nginx/html/index.html
<html>word</html>
修改容器中的内容:
root@6912add58ffc:/usr/share/nginx/html# echo -n "<html>hello</html>" > index.html
此时宿主机里的内容也变了:
root@DESKTOP-S2IEPFK:/home/caoxu/myGitWarehouse/my-git/HTTP/20240421_day07/test# cat index.html
<html>hello</html>
在宿主机和容器内修改会互相影响
修改容器中的内容:
root@6912add58ffc:/usr/share/nginx/html# echo -n "<html>hello</html>" > index.html
此时宿主机里的内容也变了:
root@DESKTOP-S2IEPFK:/home/caoxu/myGitWarehouse/my-git/HTTP/20240421_day07/test# cat index.html
<html>hello</html>
在宿主机和容器内修改会互相影响
希望容器销毁后,数据保留下来,就要用持久化机制