Docker是一个开源的应用容器引擎,它让开发者可以轻松地将应用程序及其依赖项打包到一个可移植的镜像中。这个镜像可以在任何流行的Linux或Windows操作系统上运行,从而实现跨平台的目标。容器是完全使用沙箱机制构建的,它们之间相互隔离,没有任何接口。自17.03版本以来,Docker分为社区版(CE)和企业版(EE)。Docker是一种容器化技术,旨在解决软件跨环境迁移的问题。
在学习Docker时,我们可能会对容器和镜像的关系感到困惑。实际上,一个完整的Docker系统由以下四个部分组成:Docker Client客户端、Docker Daemon守护进程、Docker Image镜像和Docker Container容器。整个Docker的生命周期包括三个部分:镜像(image)、容器(container)和仓库(repository)。
Docker镜像是由一层一层的系统文件组成的,这种分层的文件系统被称为Union FS(统一文件系统)。镜像可以通过Dockerfile构建,Dockerfile是一个描述文件,其中包含了若干条指令,每条指令都会对基础文件系统创建新的层次结构。
结合上面的图示,我们可以得出以下结论:
1. Docker容器 = 镜像 + 读写层
2. 容器是由镜像实例化而来的
3. 简单来说,镜像文件对应于进程,容器也是如此
4. 容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件
5. Docker镜像类似于虚拟机的镜像,它是一个只读模板,包含一个独立的文件系统,用于运行容器所需的数据,并可以用来创建新的容器。
6. Docker利用容器来运行应用,即Docker容器是由Docker镜像创建的运行实例。
7. Docker容器类似于虚拟机,可以执行启动、停止、重启、删除等操作。每个容器间相互隔离。其中,每个容器会运行特定的应用,同时还包含特定应用的代码及所需依赖文件。
Docker中的镜像和容器是两个不同的概念。镜像是一个只读的、静态的文件系统,包含了运行一个应用程序所需要的所有内容,包括代码、运行时、系统工具、库文件等等。容器则是一个轻量级的、可移植的、自包含的软件打包单元,它可以运行在任何支持 Docker 的主机上。
在 Docker 中,镜像是由一系列的层组成的,每一层都是由前一层所生成的。这些层可以通过 Dockerfile 进行定义和管理。而容器则是基于这个镜像创建出来的,它们之间可以互相替换,也可以共享同一个镜像。
因此,我们可以把容器看作是一个小型简易版的 Linux 环境(包含 root 用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
你好,你需要更新CentOS的yum包到最新版本,以便安装Docker。你可以使用以下命令来更新yum包:
```
yum update 2
```
接下来,你需要安装一些必要的软件包,如yum-utils、device-mapper-persistent-data和lvm2。如果提示这些软件包已经安装,只需在命令中去掉相应的安装包即可。例如:
```
yum install -y yum-utils device-mapper-persistent-data lvm2
```
然后,你需要设置yum源,以便从指定的网址下载Docker软件。你可以使用以下命令来添加Docker的yum源:
```
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```
最后,你可以使用以下命令来安装Docker:
```
yum install -y docker-ce
```
安装完成后,你可以输入以下命令来查看Docker版本,以验证是否安装成功:
```
docker -v
```
.1.4 重启Docker服务:
```
systemctl restart docker
```
7.1.5 开机启动Docker服务:
```
systemctl enable docker
```
7.2 关于Docker镜像的命令:
7.2.1 拉取指定的镜像到本地:
```
docker pull centos #拉取centos镜像,如果没有使用版本默认为latest
docker pull centos:7 # :7表示版本号
```
7.2.2 查看本地镜像:
```
docker images
```
7.2.3 删除本地镜像:
```
docker rmi imageID #根据镜像id删除镜像
docker rmi name:tag #根据名称版本号删除镜像
```
7.2.4 搜索镜像(建议在镜像仓库中搜索www.hub.docker.com)
```
docker search 镜像名称
```
7.3 关于镜像容器的命令:
7.3.1 根据镜像创建容器第一种方式:此种方式如果退出容器时,会关闭容器。
```
docker run -it --name=a1 centos:7 /bin/bash # -i保持容器一直运行,因为容器没有客户端链接会自动关闭 # -t为容器重新分配一个伪输入终端,通常与 -i 同时使用,创建一个伪 tty 终端,连接容器的标准输入接口,之后用户就可以通过终端进行输入 # --name给容器起名字 centos:7 镜像加版本号 /bin/bash 进入容器的初始化指令 这里相当于打开一个shell窗口终端随着计算机技术的发展,TTY设备逐渐演变成了终端设备。终端设备是一种通过串行接口与计算机连接的设备,可以显示计算机的输出结果,并将用户的输入传递给计算机。终端设备通常具有屏幕和键盘,用户可以通过键盘输入命令,计算机将结果显示在屏幕上。在UNIX系统中,TTY是一个重要的概念。在早期的UNIX系统中,TTY是指与计算机进行通信的设备。每个TTY设备都有一个对应的设备文件,例如/dev/tty1表示第一个TTY设备。用户可以通过TTY设备与计算机进行交互,输入命令并查看输出结果。
随着计算机技术的进步,TTY设备逐渐被图形界面取代。图形界面提供了更直观、易用的用户界面,用户可以通过鼠标和图形界面进行交互。然而,TTY仍然被广泛使用,特别是在服务器环境中。在服务器上,TTY设备可以通过SSH等远程登录方式进行访问,管理员可以通过TTY设备管理服务器。
Docker是一种容器化技术,可以将应用程序及其依赖项打包到一个可移植的容器中。以下是一些常用的Docker命令:
- `docker ps`:查询正在执行的容器。
- `docker ps -a`:查询所有容器。
- `docker run -id --name=a2 centos:7`:根据镜像创建容器不会进入容器内部,并且在后台运行容器,并打印容器id。
- `docker exec -it a2 /bin/bash`:进入指定容器内部,进入该容器后再退出不会关闭容器。
- `docker stop 容器id或名称`:关闭容器。
- `docker start 容器id或名称`:开启容器。
- `docker rm 容器id或名称`:删除容器。对于正在运行的容器删除会报错,先关闭容器再删除就可以了。
数据卷是宿主机(部署了虚拟化环境的专属物理服务器)的一个目录或者文件。当容器目录和数据卷目录绑定后,对方修改会立即同步。一个数据卷可以被多个容器同时挂载,一个容器也可以挂载多个数据卷。数据卷的作用就是解决以上问题,可以解决数据持久化,解决外部机器和容器的间接通讯问题,也可以解决容器之间的数据交换。
在创建启动容器时,使用`-v`参数设置数据卷:`docker run ... -v 宿主机目录(文件):容器内目录(文件)`。注意事项如下:
1. **目录必须为绝对地址**。
2. 如果目录不存在会自动创建。
3. 可以挂载多个数据卷。
安装MySQL
1. 创建目录:mkdir -p /root/mysql
2. 切换到mysql目录:cd /root/mysql
3. 拉取MySQL镜像:docker pull mysql:5.7
4. 创建MySQL容器:
```
docker run -d \n --name=c_mysql \n --port=3307:3306 \n --volume=$PWD/conf:/etc/mysql/conf.d \n --volume=$PWD/logs:logs \n --volume=$PWD/data/var/lib/mysql \n -e MYSQL_ROOT_PASSWORD=123456 \n mysql:5.7
```
解释:
- `-d`:以后台模式运行容器。
- `--name=c_mysql`:为容器命名为c_mysql。
- `--port=3307:3306`:将容器的3306端口映射到宿主机的3307端口。
- `--volume=$PWD/conf:/etc/mysql/conf.d`:将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf。配置目录。
- `--volume=$PWD/logs:/logs`:将主机当前目录下的logs目录挂载到容器的/logs。日志目录。
- `--volume=$PWD/data:/var/lib/mysql`:将主机当前目录下的data目录挂载到容器的/var/lib/mysql。数据目录。
- `-e MYSQL_ROOT_PASSWORD=123456`:初始化root用户的密码。
Docker镜像是由特殊的文件系统叠加而成的。最底层是bootfs,并使用宿主机的bootfs。第二层是root文件系统rootfs,称为base image:基础镜像。然后再往上可以叠加其他的镜像文件。统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器。
10.2 镜像制作
自定义镜像提供了两种方式:第一种是基于容器来制作;第二种是通过dockerfile文件来制作(重点)。步骤如下:把现有的镜像运行成一个容器,修改容器中的内容,然后变成镜像,把镜像压缩文件,交给其他人,变成本地镜像。
- `docker commit 容器id 镜像名:版本号 [把指定的容器变成镜像]`
- `docker save -o 压缩文件名 镜像名:版本号 [把指定的镜像压缩为一个压缩文件]`
- `docker load -i 压缩文件名 【把压缩文件变成本地镜像】`
10.3 Dockerfile的概念
Dockerfile是一个文本,任意一个镜像都是通过dockerfile来制作。文件包含了一条条的指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像。对于开发人员来说,可以为开发团队提供一个完成一致的开发环境;对于测试人员来说,可以直接拿开发时构建的镜像或者通过dockerfile文件构建一个新的镜像开始工作;对于运维人员来说,在部署时,可以实现应用的无缝跨平台移植。
10.4 Dockerfile的关键字
注意:命令dou'x。关键字、作用和备注如下:
- `FROM`:指定父镜像,指定dockerfile基于哪个image构建。
- `MAINTAINER`:作者信息,用来标明这个dockerfile谁写的。可以使用Label代替maintainer,最终都是在docker image基本信息中可以查看。
- `LABEL`:标签【项目】,用来标明dockerfile的标签。可以使用Label代替maintainer,最终都是在docker image基本信息中可以查看。
- `RUN`:执行命令。
Dockerfile是用于构建Docker镜像的脚本文件。它包含了一组指令,用于指定如何从基础镜像构建新的镜像。每个指令都会创建一个新的层,这些层会被叠加在基础镜像上,最终形成一个完整的镜像。
以下是一些常见的Dockerfile指令:
- `FROM`:指定基础镜像。
- `RUN`:执行命令并创建一个新的层。
- `CMD`:指定容器启动时要执行的命令。
- `ENTRYPOINT`:指定容器启动时要执行的入口点。
- `COPY`:将文件或目录复制到新层中。
- `ADD`:与`COPY`类似,但是支持远程URL和本地目录。
- `ENV`:设置环境变量。
- `ARG`:定义构建参数。
- `VOLUME`:定义可以挂载到容器中的数据卷。
- `EXPOSE`:暴露端口以供外部访问。
- `WORKDIR`:设置工作目录。
- `USER`:指定执行用户。
- `HEALTHCHECK`:指定健康检查命令。
- `ONBUILD`:在基础镜像上执行其他Dockerfile。
- `STOPSIGNAL`:设置容器退出时发送给宿主机的信号量。
- `SHELL`:指定执行脚本的shell。
以下是重构后的内容:
1. 编辑Dockerfile文件
```bash
[root@localhost docker-files]# vi centos_dockerfile
FROM centos:7 MAINTAINER aaa <2428441662@qq.com> RUN yum install -y vim WORKDIR /usr CMD [\"/bin/bash\"]
```
2. 构建镜像
```bash
[root@localhost docker-files]# docker build -f centos_dockerfile -t zz_centos:1.0 .
```
3. 创建容器
```bash
[root@localhost docker-files]# docker run -it --name=zz_centos zz_centos:1.0 /bin/bash
```
案例2:准备好springboot jar包并传至宿主机根目录,创建dockerfile文件并编辑。
```Dockerfile
FROM java:8 MAINTAINER zzz<2428441664@qq.com> ADD 11.jar app.jar CMD java -jar app.jar
```
根据Dockerfile制作镜像。
```bash
[root@localhost ~]# docker build -f ./springboot_dockerfile -t app:1.0 .
```
运行容器。
```bash
docker run -id -p 9000:8080 app:1.0
```