docker

镜像与容器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就可以作为服务端了

自己制作镜像

  1. 创建一个容器
  2. 进入容器做修改 ,例如修改index.html文件(保存在文件DOCKERFILE中)
    1. 拷贝代码&修改配置文件
    2. 编译
    3. 启动进程
  3. 打包
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>

在宿主机和容器内修改会互相影响

希望容器销毁后,数据保留下来,就要用持久化机制

相关推荐
G_H_S_3_13 分钟前
【网络运维】Linux:正则表达式
linux·运维·网络·正则表达式
huangyuchi.21 分钟前
【Linux系统】匿名管道以及进程池的简单实现
linux·运维·服务器·c++·管道·匿名管道·进程池简单实现
AAA修煤气灶刘哥30 分钟前
手把手教你全流程项目部署:从 Jenkins 到 Nginx 的项目实战手册
java·运维·后端
柏成36 分钟前
写给前端仔仔的docker实战
前端·docker·面试
czhc11400756631 小时前
LINUX 820 shell:shift,expect
linux·运维·excel
咕噜签名分发冰淇淋1 小时前
签名应用APP分发平台的微服务化部署是什么?其有哪些优势?
java·运维·微服务
望获linux2 小时前
【实时Linux实战系列】基于实时Linux的物联网系统设计
linux·运维·服务器·chrome·php
北京阿法龙科技有限公司2 小时前
AR 虚实叠加技术在工业设备运维中的实现流程方案
运维·ar
刘一说2 小时前
CentOS 系统 Java 开发测试环境搭建手册
java·linux·运维·服务器·centos