Docker安装与部署

1. 安装Docker

(1) 使用脚本自动安装(数据源为阿里云)

curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun

提示:
检查是否安装完成:

[root@localhost ~]# docker version
 Client: Docker Engine - Community
 Version:           19.03.4
 API version:       1.40
 Go version:        go1.12.10
 Git commit:        9013bf583a
 Built:             Fri Oct 18 15:52:22 2019
 OS/Arch:           linux/amd64
 Experimental:      false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

老版本的Docker被称为docker或docker-engine。如果安装了这些,请卸载它们以及相关的依赖项。

sudo yum remove docker docker-common docker-selinux docker-engine

查询安装过的包:

yum list installed | grep docker
如果有会显示:
docker-engine.x86_64                 17.03.0.ce-1.el7.centos

删除已经安装的文件:

yum -y remove docker-engine.x86_64

删除镜像/容器:

rm -rf /var/lib/docker

删除所有的数据卷:

docker volume rm $(sudo docker volume ls -q)

卸载旧版本

sudo yum remove docker  docker-common docker-selinux docker-engine

(2) 启动 Docker CE

sudo systemctl enable docker
sudo systemctl start docker

(3) 建立Docker组

sudo groupadd docker

(4) 将当前用户添加进Docker组中

sudo usermod -aG docker $USER

(5) 验证Docker是否安装成功

[root@localhost etc]# docker run hello-world
显示如下则说明安装成功:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete 
Digest: sha256:c3b4ada4687bbaa170745b3e4dd8ac3f194ca95b2d0518b417fb47e5879d9b5f
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

2. 安装镜像加速器

鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,强烈建议安装 Docker 之后配置国内镜像加速。
在经过上面步骤启动Docker后,会在 /etc/docker/ 目录下创建一个key.json。

vim /etc/docker/daemon.json

添加内容:

{
  "registry-mirrors": ["https://i4y2uiaz.mirror.aliyuncs.com"]
}

:wq 保存退出 daemon.json

注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动,然后重启Docker服务。

sudo systemctl daemon-reload
sudo systemctl restart docker

3. 安装需要的镜像

例如:docker pull tomcat

在这里插入图片描述
下载完之后使用命令查看docker下载的

docker images

在这里插入图片描述
下载的tomcat默认是latest版本的,可以上docker仓库官网查看对应版本,根据自己需求下载对应版本。
然后启动Tomcat

docker run -p 8080:8080 tomcat

也可以下载一个ubuntu的操作系统

docker pull ubuntu:16.04

运行 ubuntu 操作系统

docker run -it --rm ubuntu:16.04 bash

docker run 就是运行容器的命令,我这里简要的说明一下上面用到的参数。
-it:这是两个参数,一个是 -i:交互式操作,一个是 -t 终端。
我们这里打算进入 bash 执行一些命令并查看返回结果,因此我们需要交互式终端。
–rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。我们这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用 --rm 可以避免浪费空间。
ubuntu:16.04:这是指用 ubuntu:16.04 镜像为基础来启动容器。
bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 bash。
进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 cat /etc/os-release,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 Ubuntu 16.04.4 LTS 系统。

退出容器。

exit

查看当前运行的容器

docker ps

关闭容器

docker stop 容器id

清除容器

docker kill 容器id

4. Docker 镜像

1.列出镜像

docker image ls

在这里插入图片描述
列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间。镜像 ID 则是镜像的唯一标识,一个镜像可以对应多个标签。

2.镜像体积:
这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同。比如,ubuntu:16.04 镜像大小,在这里是 127 MB,但是在 Docker Hub 显示的却是 50 MB。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而 docker image ls 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。
另外一个需要注意的问题是,docker image ls 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS,相同的层只需要保存一份即可,因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。

docker system df

查看镜像、容器、数据卷所占用的空间。

3.虚悬镜像

镜像列表中还可以看到一个特殊的镜像,这个镜像既没有仓库名,也没有标签,均为 。
这个镜像原本是有镜像名和标签的,原来为 mongo:3.2,随着官方镜像维护,发布了新版本后,重新 docker pull mongo:3.2 时,mongo:3.2 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 。除了 docker pull 可能导致这种情况,docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像

docker image ls -f dangling=true

在这里插入图片描述
删除虚悬镜像:

docker image prune

如果上述命令无法删除,则尝试根据ImageId删除镜像:

docker rmi 882487b8be1d(image id)

如果删除不了则尝试以下命令:
查询记录

docker ps -a

找到有关虚悬镜像的记录
在这里插入图片描述
删除记录:

docker rm fa46ed6411fa

之后再删除虚悬镜像:

docker rmi 882487b8be1d

在这里插入图片描述
4.删除镜像
如果要删除本地的镜像,可以使用 docker image rm 命令,其格式为:

docker image rm [选项] <镜像1> [<镜像2> ...]
或者
docker rmi <镜像1> [<镜像2> ...]

其中,<镜像> 可以是 镜像短 ID、镜像长 ID、镜像名 或者 镜像摘要。
查看镜像摘要:

docker image ls --digests

在这里插入图片描述

5. DockerFile定制镜像

1. 修改对应容器中的文件
(1) 启动容器:docker run -p 8080:8080 tomcat
(2) 容器有沙箱隔离机制,每个容器都是独立的个体,所以想要修改的内容生效,得新开一个窗口:docker ps -a 找到对应的启动容器CONTAINER ID
在这里插入图片描述
(3) 以交互的方式进入容器:docker exec -it 8467e98b8c6d bash
在这里插入图片描述
(4) 修改容器中的文件:echo “hello docker tomcat” >> index.jsp
2. DockerFile脚本编写
(1) 创建一个空目录,然后 vi Dockerfile
(2)
FROM tomcat
RUN echo “hello docker tomcat” >> /usr/local/tomcat/webapps/ROOT/index.html
(3) 在当前目录下:docker build -t myshop .
这个.不止是当前目录的意思,还有将当前目录为上下文路径,打包到docker server的操作。
在这里插入图片描述
(4) docker images 会发现多了一个自己创建的镜像
在这里插入图片描述
(5) docker bulid 也会引起虚悬镜像,如果dockerfile脚本执行有报错则镜像不会创建成功,会创建虚悬镜像!
(6) docker 输入命令获取结果的过程实际是docker client输入命令以rest请求的方式请求docker server,docker server返回信息给 docker client的过程。
3. dockerfile指令详解
(1) COPY 复制文件

  • COPY <源路径>… <目标路径>
  • COPY ["<源路径1>",… “<目标路径>”]

和 RUN 指令一样,也有两种格式,一种类似于命令行,一种类似于函数调用。
COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。比如:
COPY package.json /usr/src/app/
<源路径> 可以是多个,甚至可以是通配符
此外,还需要注意一点,使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执行权限、文件变更时间等。这个特性对于镜像定制很有用。特别是构建相关文件都在使用 Git 进行管理的时候。
(2) ADD 更高级的复制文件
ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。
比如 <源路径> 可以是一个 URL,这种情况下,Docker 引擎会试图去下载这个链接的文件放到 <目标路径> 去。下载后的文件权限自动设置为 600,如果这并不是想要的权限,那么还需要增加额外的一层 RUN 进行权限调整,另外,如果下载的是个压缩包,需要解压缩,也一样还需要额外的一层 RUN 指令进行解压缩。所以不如直接使用 RUN 指令,然后使用 wget 或者 curl 工具下载,处理权限、解压缩、然后清理无用文件更合理。因此,这个功能其实并不实用,而且不推荐使用。
如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。
在 Docker 官方的 Dockerfile 最佳实践文档 中要求,尽可能的使用 COPY,因为 COPY 的语义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。
另外需要注意的是,ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。
因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则,所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD。
(3) CMD 容器启动命令
shell 格式:CMD <命令>
(4)
(5) ENV 设置环境变量

  • ENV < key> < value>
  • ENV < key1>=< value1> < key2>=< value2>…

定义了环境变量,那么在后续的指令中,就可以使用这个环境变量,将来升级镜像构建版本的时候,只需要更新环境变量即可。
(6) WORKDIR 指定工作目录
WORKDIR <工作目录路径>
(7) USER 指定当前用户
USER <用户名>
USER 指令和 WORKDIR 相似,都是改变环境状态并影响以后的层。WORKDIR 是改变工作目录,USER 则是改变之后层的执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份。
(8) HEALTHCHECK 健康检查
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK 指令是告诉 Docker 应该如何进行判断容器的状态是否正常,这是 Docker 1.12 引入的新指令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值