一、Docker基本概念
Docker的出现:项目完成—打包项目带上环境成为镜像—镜像上传到Docker仓库—别人下载镜像时就连着项目和项目运行的环境一起下载了—直接运行即可,不需要再搭建运行环境。
Docker的核心思想:打包装箱,每个箱子都是相互隔离的。它是一种容器技术。比如说宿主机开启多个应用可能会有端口冲突,而通过Docker隔离开来,就可以避免这种冲突。
Docker的作用:传统的虚拟机,是虚拟出一套硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件。而容器内的应用直接运行在宿主机,容器是没有自己的内核的,也没有虚拟出硬件,所以非常轻便。并且每个容器间都是相互隔离的,每个容器内都有一个属于自己的文件系统,互不影响。
基本名词:
- 镜像(image):好比是一个模板,可以通过这个模板来构建容器服务。通过这个镜像可以创建多个容器
- 容器(container):独立运行一个或者一个组应用,通过镜像来构建的。容器可以启动、停止、删除。
- 仓库:就是存放镜像的地方,分为共有仓库和私有仓库
二、安装Docker
Docker依赖于已存在并且运行的Linux内核环境。所以在Windows上部署Docker的方法是先安装一个虚拟机,并在安装Linux系统的虚拟机中运行Docker。
我是在Ubuntu系统下安装的Docker,参考Docker官方文档
- 卸载存在的旧版本
sudo apt-get remove docker docker-engine docker-ce docker.io
- 更新apt包索引并安装包,以允许apt通过HTTPS使用存储库:
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
- 增加Docker的官方GPG密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 使用以下命令设置稳定的存储库。要添加夜间存储库或测试存储库,请在下面的命令中在单词stable之后添加单词nightly或test(或两者都添加)。了解夜间频道和测试频道。
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 更新apt包索引,安装Docker Engine和containerd的最新版本,或者执行下一步安装特定版本:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
- 要安装特定版本的Docker引擎,请在repo中列出可用版本,然后选择并安装,列出可用版本
apt-cache madison docker-ce
- 使用第二列中的版本字符串安装特定版本,例如:5:18.09.13-0ubuntu-xenial。
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io
- 通过运行hello-world映像,验证Docker引擎已正确安装。
sudo docker run hello-world
三、Docker的常用命令
docker version #显示dcoker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help 帮助命令
1.镜像命令
- 查看所有本地的主机上的镜像:docker images
docker images -a #列出所有镜像
docker images -q #只显示镜像的id
- 搜索镜像:docker search
- 下载镜像:docker pull 镜像名[:tag] 如果不写tag,默认就是下载最新版本
- 删除镜像:docker rmi
docker rmi -f 容器id #删除指定的容器
docker rmi -f $[docker images -aq] #删除全部容器 先查寻所有镜像id 然后删除所有镜像
2.容器命令
有了镜像才可以下载容器
- 新建容器并启动:docker run [可选参数] images
可选参数:
--name="Name" 容器名字,用来区分容器
-d 后台方式运行,必须要有一个前台应用,如果前台没有应用,就会立刻停止
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口
-p ip:主机端口:容器端口
-p 主机端口:容器端口
-p 容器端口
容器端口
- 查看正在运行的容器:docker ps
可选项:
不带参数 列出当前正在运行的容器
-a 列出当前正在运行的容器和以前运行过的容器
-q 只显示容器的编号
- 删除容器:docker rm
docker rm 容器id #删除指定的容器,不能删除正在运行的容器
docker rm -f 容器id #删除指定的容器,能删除正在运行的容器
docker rm -f $(docker ps -aq) #删除所有的容器
- 启动容器:docker start 容器id
- 重启容器:docker restart 容器id
- 停止当前正在运行的容器:docker stop 容器id
- 强制停止当前容器:docker kill 容器id
- 容器停止并退出:exit
- 容器不停止退出:Ctrl+P+Q
3.其他命令
- 查看日志命令:docker logs
docker logs -tf --tail number(要显示的记录条数) 容器id #显示指定行数的日志
- 查看容器内部的进程信息:docker top 容器id
- 查看容器的元数据:docker inspect 容器id
- 进入当前正在运行的容器
#用后台的方式运行容器时,需要进入容器,修改配置
方式一:进入容器后开启一个新的终端,可以在里面操作
docker exec -it 容器id /bin/bash
方式二:进入容器正在执行的终端,不会启动新的进程
docker attach 容器id /bin/bash
命令测试
下载镜像出现以下错误:
解决方法:
docker pull centos #下载centos镜像
docker run -it centos /bin/bash #启动并进入容器
exit #退出容器
docker ps #查看正在运行的容器
可以看到用exit退出容器后,容器会关闭,用进程查看命令查看正在运行的进程发现此容器已经关闭
docker run -it centos /bin/bash #启动并进入容器
Ctrl+P +Q #退出但不停止容器
docker ps #查看正在运行的容器
可以发现,用ctrl+P+Q退出容器之后,容器依然在运行,并且发现刚刚运行的centos容器的id是4406db156786
docker ps -aq #显示所有容器的id
docker top 容器id #查看指定容器内部的进程
docker rm 容器id #删除指定的容器,但是不能删除正在运行的容器
docker rm -f $(docker ps -aq) #强制删除所有容器
四、部署Nginx
docker pull nginx #下载nginx
docker images #查看本机上所有镜像
docker run -d --name nginx01 -p 3344:80 nginx #以后台的方式运行nginx,并命名为nginx01,并且绑定端口 通过宿主机的端口3344可以访问到容器里面的80端口 然后启动nginx
curl localhost:3344 #测试本机的3344端口
docker ps #查看正在运行的容器
docker stop 容器id #停止容器
curl localhost:3344 # 测试本机3344端口
五、构建自己的镜像并上传
1.容器挂载
作用:docker容器中产生的数据,可以同步到本地。保证容器删了之后,数据依然在。实质就是将容器内的目录挂载到宿主机上。容器间也是可以数据共享的。
- 容器挂载:docker run -it -v 主机目录:容器内目录,主机目录与容器内的目录数据就会同步
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
把容器里的home目录挂载到宿主机的home/ceshi下,操作前后进入宿主机的home文件夹查看是否有ceshi文件夹
进入容器的home目录后,新建文件夹test,并在宿主机/home/ceshi下查看
删除容器,查看发现宿主机/home/ceshi下的文件依然存在
2.DockerFile构建镜像
DockerFile就是构建docker镜像的构建文件
- 编写一个dockerfile文件
- docker build 构建为一个镜像
- docker run 运行镜像
- docker push 发布镜像
文件中:
- 每个保留关键字(命令)必须是大写字母
- 从上到下执行
- #表示注释
- 每一个指令都会创建提交一个新的镜像层
DockerFile指令:
FROM #基础镜像,一切从这里开始构建
MAINTAINER #镜像是谁写得 姓名+邮箱
RUN #镜像构建的时候需要运行的命令
ADD #添加内容
WORKDIR #镜像的工作目录
VOLUME #挂载的目录
EXPOSE #指定对外的端口
CMD #指定容器启动的时候执行的命令,只有最后一个课生效并且可被替代
ENTRYPOINT #指定容器启动的时候执行的命令,可以追加命令
COPY #将文件拷贝到镜像中
ENV #构建的时候设置环境变量
如:
FROM centos
VOLUME【‘volume01’,'volume02'】
CMD echo '...end..'
CMD /bin/bash
3.发布镜像
- 在dockerHub上注册账号
- 登录:docker login -u 同户名
- docker push 作者/镜像名:版本号
4.centos镜像构建
在home目录下新建目录dockerfile并进入,新建一个文件mydockerfile-centos,编写文件内容:这里设置了工作目录为/user/local 那么如果进入这个镜像的容器默认的工作目录就是/user/local
FROM centos
ENV MYPATH /user/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo '...end...'
CMD /bin/bash
通过这个文件来构建镜像:-f后跟的是文件的地址 ,-t表示生成,mycentos表示生成镜像的名字,0.1是版本
docker build -f mydockerfile-centos -t mycentos:0.1 .
查看所有镜像,发现自己的镜像已经成功生成
测试运行:docker run -it mycentos:0.1 发现进入了我们设置的工作目录
六、Docker网络
1.网络互联
创建两个tomcat容器:tomcat01和tomcat02 执行ping命令 发现并不能通过容器名ping通
通过下面的命令建立创建tomcat03并将tomcat03连接到tomcat01上,发现可以通过容器名ping通
docker run -it -P --name tomcat03 --link tomcat01 tomcat
2.自定义网络
好处:不同的集群使用不同的网络,保证集群是安全的
创建一个自定义网络 driverbridge是桥接模式 子网是192.168.0.0/16 网关是192.168.0.1 名字是mynet
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
docker network ls 看一下
启动两个在自己网络的tomcat
docker run -it -P --name tomcat-net-01 --net mynet tomcat
docker run -it -P --name tomcat-net-02 --net mynet tomcat
自定义的网络中可以通过容器名互相ping
docker exec -it tomcat-net-01 ping tomcat-net-02
3.网络连通
tomcat01 tomcat02是在docker01网段上的
tomcat-net-01 tomcat-net-02是在mynet上的
两个网段是不同的,互相是不通的
现在打通tomcat01到mynet :
docker network connect mynet tomcat01
发现tomcat01直接放到了mynet网络下
`docker network inspect mynet`
现在tomcat01可以直接ping通tomcat-net-01
docker exec -it tomcat01 ping tomcat-net-01