Ubuntu上docker安装
UBUNTU 20.04 LTS 安装DOCKER看高博主的博文,一键复制命令安装即可。
docker命令
docker version
查看你docker版本信息
docker info
显示docker系统级别的信息
docker --help
docker命令查询
docker docs的referrence介绍了docker的详细命令
镜像操作
docker images
镜像命令
docker search
搜索镜像
docker pull
下载镜像
docker pull [镜像名或Id][:tag]
下载指定镜像
镜像是一种分层的结构,是一层一层构建的,镜像之间有明显的层次结构,不同镜像之间累加完成共有的任务,镜像的叠加是由顺序的。
例如使用docker引擎构建一个tomcat环境,需要先构建ubuntu或者centos镜像,在再该镜像上构建jdk环境,再构建tomcat环境。构建mysql也是如此,实际上docker镜像的层次分化的更细,从下载的过程也能看出来,是层次下载的。
先下载了mysql最新版,然后再下载mysql5.7版,之前的镜像下载好了无需再下载,只需要下载mysql5.7的部分即可。
docker rmi
删除镜像
容器命令
下载完镜像后需要根据镜像配置自定义的容器,用于运行定制化的服务,基于镜像构建容器的命令是docker run
。
该命令参数较多比较复杂,请移步官网查看。
docker log
查看容器内部日志
docker top
查看容器内部镜像进程
docker exec
在正在运行的容器操作命令
docker attach
连接后台运行的docker容器并进入。
docker cp
克隆容器数据到主机
镜像阉割
有时候构建一个mysql镜像,进去linux底层发现好多命令都被阉割了,仅支持运行服务的最小内核,该镜像仅当部署使用。
数据同步
docker是一个相对封闭的空间,需要通过端口映射来实现访问,通过docker部署引用必然需要将文件上传到docker内部,然而docker只是主机上的一个服务,显然不存在文件上传到容器内部一说。
在docker中存在数据卷的概念,也就是docker服务的专属文件夹,docker服务的数据使用该文件夹的内容,该文件夹和docker内部的数据同步修改。简单来说就是为docker服务配置一个专属目录,docker服务所使用和产生的数据都会保存于此。
docker run -v [主机目录:容器目录]
命令实现。
需要注意的是只能挂在文件夹,不能挂在文件,因此如果需要挂在文件夹下若干文件中的其中一个是需要提前在主机上新建文件。
-v [主机文件夹]:[容器文件或文件夹]
主机只能是文件夹,容器是文件时就会同步到主机文件夹下,是文件夹是会同步两个文件夹。
# 不然会报错如下
docker: Error response from daemon: failed to create task for container: failed to create
shim task: OCI runtime create failed: runc create failed: unable to start container
process: error during container init: error mounting "/home/docker-volumes/nginx/conf" to
rootfs at "/etc/nginx/nginx.conf": mount /home/docker-
volumes/nginx/conf:/etc/nginx/nginx.conf (via /proc/self/fd/6), flags: 0x5000: not a
directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check
if the specified host path exists and is the expected type.
还有情况是路径不对主机路径不对,如下
映射路径为/home/docker-volumes
但是实际却是/home/xwh
。
由于nginx.conf是文件,其他两个都是目录,所以需要现在目录下新建文件
docker run -id --name nginx-proxy -p 80:80
-v /home/xwh/docker-volumes/nginx/html:/usr/share/nginx/html
-v /home/xwh/docker-volumes/nginx/nginx.conf:/etc/nginx/nginx.conf
-v /home/xwh/docker-volumes/nginx/conf.d:/etc/nginx/conf.d
nginx
这个命令本身没有问题,但是如果没有新建文件就会报错,conf.d和html都是文件夹,nginx.conf是文件。
虽然编号出来了但是还是没启动原因是,如下niginx.conf出现问题。
解决方案:docker nginx -v 挂载配置文件问题
给nginx挂载卷,要先有一个配置文件才能挂载,具体做法就是先以不挂载卷的形式正常启动一个nginx容器,然后从中cp拷贝一份配置文件,删除这个容器,再重新以挂载卷的形式启动一个新容器。
解决方案:
- 不挂在数据卷生成容器,目的是生成配置文件
成功运行,如下
2. 将容器生成的配置文件copy到主机
先停掉容器将容器的nginx.conf克隆到主机到主机中,查看nginx.conf有正常配置文件即可。
- 再次重新挂在,如下
docker run -id --name nginx-proxy -p 80:80 -v /home/xwh/docker-volumes/nginx/html:/usr/share/nginx/html -v /home/xwh/docker-volumes/nginx/nginx.conf:/etc/nginx/nginx.conf -v /home/xwh/docker-volumes/nginx/conf.d:/etc/nginx/conf.d nginx
如上图所示,容器成功运行,nginx服务也启动了。
dockerfile
使用docker拉取镜像后可以根据需求自定义镜像,并将镜像打包,或者上传到docker hub供任何人使用,而每次进入镜像的对镜像镜像自定义的DIV确实十分繁琐的。
dockerfile提供了一种语法,按照一定语法编写可以自定义docker镜像,官方提供了相关命令运行dockerfile用于构建镜像。
docker中文学习网站
Dockerfile 由一行行命令语句组成,并且支持以 # 开头的注释行。Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
指令 | 描述 |
---|---|
FROM | 指明基础镜像信息(镜像都是一层一层叠加的,但都是在基础镜像之上) |
MAINTAINER | 指明维护者信息 |
RUN | RUN 指令将对镜像执行跟随的命令。每运行一条 RUN 指令,镜像添加新的一层,并提交。格式为:RUN<command> 或 RUN ["executable", "param1", "param2"] 。前者将在 shell 终端中运行命令,即 /bin/sh -c;后者则使用 exec 执行。 |
CMD | CMD 指令来指定运行容器时的操作命令。 |
EXPOSE | 指定Docker 服务端容器暴露的端口号 |
WORKDIR | 格式为 WORKDIR /path/to/workdir。为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。 |
ENV | 格式为:ENV <key> <value> 。 指定一个环境变量,会被后续 RUN 指令使用,并在容器运行时保持。 |
ADD | 格式为:ADD <src> <dest> ,该命令将复制指定的 <src> 到容器中的 <dest> ,若是压缩包会自动解压 |
COPY | 格式为COPY <src> <dest> 。复制本地主机的 <src> (为 Dockerfile 所在目录的相对路径)到容器中的 <dest> 。 |
ENTRYPOINT | 配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。 |
VOLUME | 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。 |
USER | 指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。 |
ONBUILD | 格式为 ONBUILD [INSTRUCTION]。配置当所创建的镜像作为其它新创建镜像的基础镜像时,所执行的操作指令。 |
CMD命令与ENTRYPOINT的区别在于前者只生效最后一个命令,后者可以执行若干命令。
编写完dockerfile后通过docker build
命令来创建镜像。也可以通过.dockerignore
文件(每一行添加一条匹配模式)来让 Docker 忽略路径下的目录和文件。要指定镜像的标签信息,可以通过-t
选项。
dockerfile构建完镜像后可以发布到docker hub中央仓库,需要先注册一个账号,步骤如下:
docker login -u [username]
docker push [镜像名称]:[tag]
docker tag命令为镜像设置标签,需要设置标签才能正常提交,不然没有版本信息
镜像服务器
在开发过程中例如java最终会生成一个jar包,那么其他开发者拿到jar包后直接java -jar
就可以运行jar包。但是有前提条件的:
- jdk环境
- 数据库环境
- 中间件环境
如果java使用的jdk11,就需要开发者在机器上安装jdk11版本,如果使用的mysql8还需要安装mysql对应版本,同理以及各种中间件。这些都需要严格按照开发环境的配置。但是docker的存在使这些都可以一键化配置,不会在出现版本问题。
例如通过dockerfile编写jdk环境,mysql环境,redis环境生成一个dockerfile,然后将代码的jar文件和dockerfile打包为一个镜像,那么任何拿到镜像直接构建容器就能运行了,无需配置任何环境。
docker网络
在主机未安装docker是只有两个网卡,如下,一个是本机地址另一个是内网地址。
本机地址是用来访问本机的网络服务的,例如在本机运行一个tpc服务,或者http的web服务都需要使用本机地址127.0.0.1
,每个机器的主机都是127.0.0.1。内网地址是在同一局域网下区分不同不同主机的,在网络原理是学习了每个电脑都是一个固定的ip实现计算机的通讯,但实际每个电脑有一个固定ip是不现实的,其实只有一个网络有一个固定的ip,也就是一个网线对应一个ip。
连接在同一网线下的电脑实现通讯就是内网实现的,在统一网络下实现了一个局域网,也就是192.168开头的私网,由于路由器作用内网ip是有dhcp服务器自动分配的,因此不会重复,所以每台计算机在统一网络下但有不同的内网ip,也是唯一的也能实现通讯。
但是在主机上启动的dcoker服务只是主机上的进程显然也是公用内网ip的,通过端口区分不同服务。docker服务通过端口映射实现外部访问。docker又可以构建一个独立的服务,如果docker之间要实现访问网络服务的话,就需要自己的ip了,没有ip是无法实现网络服务的。
docker有自己的网络服务docker0
,实现docekr内部的网络服务,如下
docker内部实现了新的路由机制,是基于B类地址也就是172开头的,该类地址可容纳65535太计算机因此也就意味这台硬件支持的能力下,一台主机可以启动最大这莫多的docker服务。局域网使用C类地址也就是192只能容纳小部分计算机,是计算机默认局域网使用的ip地址。
启动容器时docker网络会自动生成一个B类地址,作为docker服务的专属ip地址,ip之间通过桥接连接。
下载nginx镜像
在docker中提供了--link
来绑定网络实现网络的联通。
docker网络
docker