Docker基本操作

一、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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值