侧边栏

Docker学习笔记01---基础知识

Docker学习笔记01

Docker学习

  1. Docker的概述

  2. Docker的安装

  3. Docker的命令

    1. 镜像命令

    2. 容器命令

    3. 操作命令

    4. 。。。

  4. Docker镜像

  5. 容器数据卷

  6. DockerFile

  7. Docker网络原理

  8. IDEA整合Docker

  9. Docker Compose'

  10. Docker Swarm

  11. CI\CD Jenkins

Docker概述

Docker为什么会出现?

开发--线上,应用环境和业务环境--》自己的环境

需要各种环境配置

发布项目(包括各种环境),项目和环境一起打包迁移。

有些开发环境与其他环境不能跨平台。

传统:jar包--》运维去部署

现在:开发--打包部署上线,一套流程做完。

Docker解决上面带来的问题

java-- apk -- 发布(应用商店) --使用APK --安装即可

java --jar (环境)-- 打包项目带上环境(镜像)--(Docker仓库:商店)--下载我们发布的镜像--直接允许即可(镜像机制)

Dockerd的思想就来自于集装箱!

JRE-- 多个应用(端口冲突)--原来都是交叉的

隔离:Docker的核心思想!打包装箱!每个箱子都是相互隔离的

Docker通过隔离机制,可以将服务器利用到极致.

本质:所有的技术都是因为出现了问题,我们需要去解决,漕渠学习

Docker的历史

2010,几个IT年轻人,成立一家dotCloud

做一些pass的云计算服务!LXC有关的容器技术!

Vmware的应用--笨重--

他们将自己的技术(容器化技术)命名, 就是Docker!

Docker刚刚诞生的时候并没有引起行业的注意,dotCloud!--活不下去

开源

开发源代码

2013年,Docker开源

Docker越来越多的人发现的Docker的优点! 火力,Docker每个月都会更新一个版本.

2014年4月9号,Docker 1.0发布!

Docker为啥这么火, 十分轻巧

在容器技术出来之前,我们使用的都是虚拟机技术.

虚拟机:在windows中装一个Vmware,通过在这个软件上虚拟出来一个单独的电脑!相当与一个真实的电脑!笨重!

虚拟机也是一种虚拟化技术,Docker容器技术,也是虚拟化技术

 VM:linux centos原生镜像(一个电脑)  隔离,需要开启多个虚拟机 几个G 几分钟
 docker:隔离,镜像(最核心的环境 4m+jdk + mysql )十分的小巧,运行镜像即可 小巧 各个M KB 秒级启动

聊聊Docker

Docker 是基于GO语言开发的,开源项目

官网:https://www.docker.com/

文档:https://docs.docker.com/

仓库地址:https://hub.docker.com/

Docker可以做什么

之前的虚拟机:

缺点:

  1. 资源占用非常多

  2. 冗余步骤多

  3. 启动很慢

容器化技术

比较Docker和虚拟机技术的不同

  1. 传统的虚拟机,虚拟出来一套硬件,运行一个完整的操作系统,软后在系统上安装和运行软件

  2. 容器内的应用直接运行在 宿主机上,容器是没有自己的内核,也没有虚拟的我们的硬件,所以就轻便了

  3. 每个容器间,是相互隔离的,每一个容器都有一个属于自己的文件系统,互不影响

DevOps(开发 运维)

应用跟快速的交付和部署

传统:一堆帮助文档,安装程序

Docker:打包镜像发布测试,一键运行

跟边界的升级和缩容

使用Docker之后,我们部署应用就像搭积木一样

项目打包一个镜像,扩展 服务器A 服务器B

更简单的系统运维

在容器化之后,我们的开发,测试环境都是高度是一致的

跟高效的计算资源利用

Docker是 内核级别的虚拟化,可以在一个物理机上可以运行很多个容器实例,服务器的性能可以被压榨到极致

Docker的安装

Docker的基本组成

镜像(image):

docker镜像就好比一个模板,可以通过这个模板来创建容器服务,tomcat镜像>run>tomcat01容器(提供服务的),通过这个镜像可以创建多个容器(最终服务运行或者项目就在容器中运行)

容器(container)

Docker利用容器技术,独立运行一个或者多个组应用,通过镜像来创建

启动,停止,删除,基本命令

目前就可以把这个容器理解为一个简单的Linux系统

仓库(repositor)

仓库就是存放镜像的地方!

仓库分为共有仓库和私有仓库

Docker Hub(默认是国外的)

阿里云...都有容器服务器(配置镜像加速 ! )

安装Docker

环境的准备

  1. 需要会一点点的Linux基础

  2. Centos的基础

  3. 使用MobaXterm连接服务器进行操作!

环境的查看

 # 系统的内核是3.10以上的
 [root@localhost ~]# uname -r
 3.10.0-327.el7.x86_64 
 #系统的版本
 [root@localhost ~]# cat /etc/os-release
 NAME="CentOS Linux"
 VERSION="7 (Core)"
 ID="centos"
 ID_LIKE="rhel fedora"
 VERSION_ID="7"
 PRETTY_NAME="CentOS Linux 7 (Core)"
 ANSI_COLOR="0;31"
 CPE_NAME="cpe:/o:centos:centos:7"
 HOME_URL="https://www.centos.org/"
 BUG_REPORT_URL="https://bugs.centos.org/"
 ​
 CENTOS_MANTISBT_PROJECT="CentOS-7"
 CENTOS_MANTISBT_PROJECT_VERSION="7"
 REDHAT_SUPPORT_PRODUCT="centos"
 REDHAT_SUPPORT_PRODUCT_VERSION="7"

安装

帮助文档:https://docs.docker.com/engine/install/centos/

安装文档:https://blog.csdn.net/weixin_39477597/article/details/87715899

确定是Centos7以上的版本

yum安装gcc环境(需要确保虚拟机可以上外网)

yum -y install gcc
yum -y install gcc-c++
#Step1.检查是否安装过 docker :yum list installed|grep docker 
 #使用命令 yum -y remove docker-ce.x86_64  卸载
 #删除存储目录
 # rm -rf /etc/docker
 # rm -rf /run/docker
 # rm -rf /var/lib/dockershim
 # rm -rf /var/lib/docker
 #Step2. 使用命令 uname-r 检查centOs的内核版本 docker要求centOs的内核版本在3.10 以上
 #Step3. 移除旧版本:sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
 #Step4. 安装必要的系统工具:sudo yum install -y yum-utils device-mapper-persistent-data lvm2
#1.卸载旧的版本
  sudo yum remove docker \
                   docker-client \
                   docker-client-latest \
                   docker-common \
                   docker-latest \
                   docker-latest-logrotate \
                   docker-logrotate \
                   docker-engine
 #2.需要安装的安装包
  sudo yum install -y yum-utils
  
 #3.设置镜像的仓库(国外)
  sudo yum-config-manager \
     --add-repo \
     https://download.docker.com/linux/centos/docker-ce.repo  #默认是国外的
   
 sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  #推荐使用国内的镜像资源.比较快
#建议事先 更新yum 的软件包的索引
 [root@localhost ~]# yum makecache fast
#4.安装docker相关的引擎 docker-ce 社区 ee企业版
 sudo yum install docker-ce docker-ce-cli containerd.io
 #安装docker-ce : sudo yum -y install docker-ce 
#5.启动Docker
 sudo systemctl start docker
 ​
 #6.使用Docker version来测试是否启动成功
 docker version
# 加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://8y3ymul4.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

  #7.hello-world
 docker run hello-world

 #8.查看一下 下载的这个hello-world镜像

用Ubuntu或者kali安装docker

在unbuntu上面安装docker很简单,首先确保自己的linux内核是3.10以上的版本;
输入命令查看内核版本

┌──(root💀kali)-[/etc/apt]
└─# uname -a
Linux kali 5.10.0-kali7-686-pae #1 SMP Debian 5.10.28-1kali1 (2021-04-12) i686 GNU/Linux

安装docker的命令也很简单

┌──(root💀kali)-[/etc/apt]
└─# sudo apt-get update
正在读取软件包列表... 完成
┌──(root💀kali)-[/etc/apt]
└─# sudo apt-get install -y docker.io     
正在读取软件包列表... 完成
正在分析软件包的依赖关系树... 完成
正在读取状态信息... 完成
将会同时安装下列软件:

安装的时间可能有一点长,请耐心等待。。。
安装完成后可能需要启动下。。

┌──(root💀kali)-[/etc/apt]
└─# systemctl start docker

设置开机就启动docker

systemctl enable docker

查看docker是否安装成功

┌──(root💀kali)-[/etc/apt]
└─# docker version   
Client:
 Version:           20.10.5+dfsg1
 API version:       1.41
 Go version:        go1.15.9
 Git commit:        55c4c88
 Built:             Wed Aug  4 19:52:47 2021
 OS/Arch:           linux/386
 Context:           default
 Experimental:      true
persission denied…

如果你是用#root权限安装的,没问题下面就不用管了

注意这里只显示了Client的信息,如果下面有一个报错: persission denied…,这个是因为我们安装的时候是用的sudo安装,在这里是没有权限连接docker的服务端,解决办法是把当前用户加入到docker组里面去。

首先新建一个docker组

sudo groupadd docker

但是很可能已经有了docker组了,已有的话就不用管了,继续下一步

然后把当前用户加入docker组

sudo gpasswd -a ${USER} docker

重启docker

sudo service docker restart

最后一步切换当前会话到新 group

newgrp - docker

最后一步是必须的,如果不切换,组信息不会立刻生效的。

最后测试下效果

docker version

最后的最后,因为国内网速问题,下载镜像比较慢所以可以使用国内大厂提供的加速器,我这里使用的是阿里云提供的加速器

使用镜像加速必须得改一下docker的配置文件 /etc/docker/daemon.json

sudo vim /etc/docker/daemon.json

在里面加入镜像加速器地址。。

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

了解:卸载docker,指定版本安装

https://blog.csdn.net/weixin_42116713/article/details/113491039

https://zhuanlan.zhihu.com/p/307945574

https://blog.csdn.net/zhanremo3062/article/details/114652850

发现docker启不起来,如果出现这个错误,可能是docker的版本太高,换一个docker 的版本试试

指定版本安装

[root@localhost ~]# systemctl start docker
Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.
 #1.卸载依赖
 yum remove docker-ce docker-ce-cli containerd.io
 ​
 #2.删除资源
 rm -rf /var/lib/docker 
 ​
 # /var/lib/docker docker的默认工作路径

#指定下载版本 yum install docker-ce-17.09.0.ce
# 1.安装yum-utils
sudo yum install -y yum-utils
# 2.设置稳定的存储库
sudo yum-config-manager 
--add-repo 
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 下面是官网的, 上面使用阿里云的 国内比较快
#    https://download.docker.com/linux/centos/docker-ce.repo

# 1. 直接安装最新docker版本
sudo yum -y install docker-ce docker-ce-cli containerd.io
# 2. 安装完成后查看版本
docker -v

# 如果想安装不同版本
# 1.列出可用版本
yum list docker-ce --showduplicates | sort -r
# 2.安装指定版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
如:
sudo yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
# 1.卸载 Docker 引擎、CLI 和容器包
sudo yum remove docker-ce docker-ce-cli containerd.io
# 2.主机上的图像、容器、卷或自定义配置文件不会自动删除。要删除所有图像、容器和卷
sudo rm -rf /var/lib/docker
# 3.必须手动删除任何编辑的配置文件。
sudo apt install docker-ce=<VERSION> docker-ce-cli=<VERSION> containerd.io

1、列出可用版本
apt-cache madison docker-ce
如下图所示:
cb77e94ab5c2370b70b19fc335ec4a1e.png
2、选择一个版本来安装,本文所要安装的是docker(18.06)
$ sudo apt-get install docker-ce=
比如:
$ sudo apt-get install docker-ce=18.06.1~ce~3-0~ubuntu
3、查看是否安装正常,运行以下命令即可
$ sudo systemctl start docker

阿里云镜像加速

  1. 登陆阿里云地址;https://homenew.console.aliyun.com/home/dashboard/ProductAndService

    1. 找到容器镜像服务

2.找到镜像加速器

3.配置使用

 sudo mkdir -p /etc/docker
 ​
 sudo tee /etc/docker/daemon.json <<-'EOF'
 {
   "registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
 }
 EOF
 ​
 sudo systemctl daemon-reload
 ​
 sudo systemctl restart docker

回顾HelloWorld的流程

底层原理

Docker是怎么工作的?

Docker是一个Client - Server 结构的系统,Docker的守护进程运行在主机上,通过Socket从客户端访问的.

DockerServer接收到Docker-Client的指令 , 就会执行这个命令!

Docker为什么比虚拟机Vmware 快?

  1. Docker有着比虚拟机更少的抽象层.

  2. docker利用的是宿主机的内核,vm需要是Guest OS

所以说,新建一个容器的时候,docker不需要像虚拟机一样重新加载一个操作系统的内核.避免引导.虚拟机是加载Guest OS,分钟级别的,而Docker是利用宿主机的操作需要,省略了这个复杂的过程.秒级!

Docker的常用的命令

帮助命令

docker version #显示docker的详细信息
docker info       #显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help  #万能命令,帮助文档.

帮助文档的地址:https://docs.docker.com/reference/

镜像命令

docker images 查看所有本地的主机上的镜像

[root@localhost yum.repos.d]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED      SIZE
hello-world   latest    d1165f221234   3 days ago   13.3kB

#解释
REPOSITORY  镜像的仓库源
TAG            镜像的标签
IMAGE ID    镜像的ID
CREATED        镜像的创建时间
SIZE        镜像的大小

#可选项
[root@localhost yum.repos.d]# docker images --help
Usage:  docker images [OPTIONS] [REPOSITORY[:TAG]]
List images
Options:
  -a, --all             Show all images (default hides intermediate images)#列出所有镜像
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show image IDs        #只显示镜像的ID

docker search 搜索镜像

[root@localhost]# docker search mysql
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   10589     [OK]
mariadb                           MariaDB Server is a high performing open sou…   3963      [OK]
mysql/mysql-server                Optimized MySQL Server Docker images. Create…   778 

#可选项,通过搜索来过滤
[root@localhost]# docker search mysql --help

Usage:  docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output
      
--fileter=STARS=3000    #搜索出来的镜像就是STARS大于30000的

docker pull 下载镜像

#下载镜像 doker pull 镜像名字[:tag]
[root@localhost ~]# docker pull --help

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Pull an image or a repository from a registry

Options:
  -a, --all-tags                Download all tagged images in the repository
      --disable-content-trust   Skip image verification (default true)
      --platform string         Set platform if server is multi-platform capable
  -q, --quiet                   Suppress verbose output
 
[root@localhost ~]# docker pull mysql
Using default tag: latest        #如果不写 tag ,默认就是latest最高版本
latest: Pulling from library/mysql
a076a628af6f: Pull complete        #分层下载,docker images的核心 联合文件系统
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Extracting  56.82MB/113.1MB
80539cea118d: Download complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c    #签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest    #真实地址

#等价
docker pull MySQL
dockers pull docker.io/library/mysql:latest

#指定版本下载
[root@localhost ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists
f6c208f3f991: Already exists
88a9455a9165: Already exists
406c9b8427c6: Already exists
7c88599c0b25: Already exists
25b5c6debdaf: Already exists
43a5816f1617: Already exists
1831ac1245f4: Pull complete
37677b8c1f79: Pull complete
27e4ac3b0f6e: Pull complete
7227baa8c445: Pull complete
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi -f 删除镜像命令

[root@localhost ~]# docker rmi --help

Usage:  docker rmi [OPTIONS] IMAGE [IMAGE...]

Remove one or more images

Options:
  -f, --force      Force removal of the image
      --no-prune   Do not delete untagged parents

[root@localhost ~]# docker rmi -f 镜像的id  #删除指定的容器
[root@localhost ~]# docker rmi -f i镜像的id 容器的id 容器的id #删除多个容器
[root@localhost ~]# docker rmi -f $(docker images -aq)  #删除全部的容器

容器命令

说明:我们有了镜像才可以创建容器,linux,下载一个centos 镜像来测试学习

docker pull centos

新建容器并启动

docker run [可选参数] image

#参数说明

--name="name"    容器名字 tomcat01 tomcat02,用来区分容器
-d                后台方式运行
-it                使用交互方式运行,进入容器查看内容
-p                指定容器的端口 -p 8080:8080
    -p ip:主机端口:容器端口
    -p 主机端口:容器端口(常用)
    -p 容器端口
    容器端口
-P                随机指定端口

#测试,启动并进入容器
docker run -it centos /bin/bash
[root@localhost ~]# docker run -it centos /bin/bash
[root@69b33819a9fe /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
#从容器中退出主机
[root@69b33819a9fe /]# exit

列出所有的运行的容器

#docker ps 命令
    #列出当前正在运行的容器
-a    #列出当前正在运行的容器,和历史运行过的容器
-n=?    #显示最近创建的容器
-q        #显示容器的编号
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE         COMMAND       CREATED         STATUS                            PORTS     NAMES
69b33819a9fe   centos        "/bin/bash"   2 minutes ago   Exited (130) About a minute ago             gracious_lamarr
768d934f05a3   hello-world   "/hello"      38 hours ago    Exited (0) 38 hours ago                     great_davinci

退出容器

exit #直接容器退出并停止
Ctrl + P + Q    #退出不停止容器

删除容器

docker rm 容器 id                    #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
docker rm -f $(docker ps -aq)     #删除所有的容器
dockr ps -a -q|xargs docker rm     #删除所有的容器

启动和停止容器的操作

docker start 容器id     #启动容器
docker stop 容器id     #停止当前正在运行的容器
docker restart 容器id #重启容器
docker kill 容器id     #强制停止当前容器

常用的其他命令

后台启动容器

#命令 docker run -d 镜像名

[root@localhost ~]# docker run -d centos
# 问题docker ps ,发现 centos 停止了

#常见的坑:docker 容器使用后台运行,就必须要有一个前台进行,docker发现没有应用,就会自动停止
#nginx,容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序

查看日志

docker log -f -t --tail 条数 镜像id #容器,没有日志
[root@localhost ~]# docker logs --help
Usage:  docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
Options:
      --details        Show extra details provided to logs
  -f, --follow         Follow log output
      --since string   Show logs since timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g. 42m
                       for 42 minutes)
  -n, --tail string    Number of lines to show from the end of the logs (default "all")
  -t, --timestamps     Show timestamps
      --until string   Show logs before a timestamp (e.g. 2013-01-02T13:23:37Z) or relative (e.g.
                       42m for 42 minutes)


#编写一段脚本
while true;do echo cai007;sleep 1;done
[root@localhost ~]#docker run -d centos /bin/sh -c "while true;do echo cai007;sleep 1;done"

[root@localhost ~]# docker ps

#显示日志
--tf                 #显示全部日志
--tail number         #显示日志条数
[root@localhost ~]# docker logs -t -f --tail 10 300e315adb2f

查看容器中的进程信息ps

#命令 docker top 容器id
[root@localhost ~]# docker top 1b51c68d06bb
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                7352                7332                0                   10:09               pts/0               00:00:00   

查看镜像的元数据

#命令
docker inspect 容器id

#测试
[root@localhost ~]# docker inspect 1b51c68d06bb
[
    {
        "Id": "1b51c68d06bbf5a43c7a9b524ae7199b2ba15df66eb5038947962be55065084f",
        "Created": "2021-03-11T02:09:52.999448823Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 7352,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-03-11T02:09:55.056606873Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
        "ResolvConfPath": "/var/lib/docker/containers/1b51c68d06bbf5a43c7a9b524ae7199b2ba15df66eb5038947962be55065084f/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/1b51c68d06bbf5a43c7a9b524ae7199b2ba15df66eb5038947962be55065084f/hostname",
        "HostsPath": "/var/lib/docker/containers/1b51c68d06bbf5a43c7a9b524ae7199b2ba15df66eb5038947962be55065084f/hosts",
        "LogPath": "/var/lib/docker/containers/1b51c68d06bbf5a43c7a9b524ae7199b2ba15df66eb5038947962be55065084f/1b51c68d06bbf5a43c7a9b524ae7199b2ba15df66eb5038947962be55065084f-json.log",
        "Name": "/intelligent_visvesvaraya",
        "RestartCount": 0,
        "Driver": "devicemapper",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "default",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "host",
            "Dns": [],
            "DnsOptions": [],
            "DnsSearch": [],
            "ExtraHosts": null,
            "GroupAdd": null,
            "IpcMode": "private",
            "Cgroup": "",
            "Links": null,
            "OomScoreAdj": 0,
            "PidMode": "",
            "Privileged": false,
            "PublishAllPorts": false,
            "ReadonlyRootfs": false,
            "SecurityOpt": null,
            "UTSMode": "",
            "UsernsMode": "",
            "ShmSize": 67108864,
            "Runtime": "runc",
            "ConsoleSize": [
                0,
                0
            ],
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": null,
            "BlkioDeviceWriteBps": null,
            "BlkioDeviceReadIOps": null,
            "BlkioDeviceWriteIOps": null,
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "KernelMemory": 0,
            "KernelMemoryTCP": 0,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": false,
            "PidsLimit": null,
            "Ulimits": null,
            "CpuCount": 0,
            "CpuPercent": 0,
            "IOMaximumIOps": 0,
            "IOMaximumBandwidth": 0,
            "MaskedPaths": [
                "/proc/asound",
                "/proc/acpi",
                "/proc/kcore",
                "/proc/keys",
                "/proc/latency_stats",
                "/proc/timer_list",
                "/proc/timer_stats",
                "/proc/sched_debug",
                "/proc/scsi",
                "/sys/firmware"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "DeviceId": "29",
                "DeviceName": "docker-253:0-6807780-e119e0df693b087335ead2c23457a2a857d627c4281a25a24d09d468d0b08a44",
                "DeviceSize": "10737418240"
            },
            "Name": "devicemapper"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "1b51c68d06bb",
            "Domainname": "",
            "User": "",
            "AttachStdin": true,
            "AttachStdout": true,
            "AttachStderr": true,
            "Tty": true,
            "OpenStdin": true,
            "StdinOnce": true,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20201204",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "2cafed0eecee28eaca661731315b18d65cc9bee2494f4ea6fb0ec676a6e2e8fe",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/2cafed0eecee",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "f6a077c2e09ea018b0d5957974756564e415f5ea23ee96a5d60ff7e3e1b3f76d",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.3",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:03",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "29ac9086e0a2908eb23107631795ffac3b3b402aa631aa4e7d157c21ea0e3b84",
                    "EndpointID": "f6a077c2e09ea018b0d5957974756564e415f5ea23ee96a5d60ff7e3e1b3f76d",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
            }
        }
    }
]

进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置

#命令
docker exec -it 容器id /bin/bash

#测试
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
1b51c68d06bb   centos    "/bin/bash"   12 minutes ago   Up 12 minutes             intelligent_visvesvaraya
9b5fc811d7e5   centos    "/bin/bash"   12 minutes ago   Up 12 minutes             strange_dijkstra
[root@localhost ~]# docker exec -it 9b5fc811d7e5 /bin/bash
[root@9b5fc811d7e5 /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
[root@9b5fc811d7e5 /]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 02:09 pts/0    00:00:00 /bin/bash
root         16      0  0 02:22 pts/1    00:00:00 /bin/bash
root         32     16  0 02:23 pts/1    00:00:00 ps -ef

#方式2
docker attach 容器id
[root@9b5fc811d7e5 /]#docker attach 1b51c68d06bb
正在执行的当前代码...

#docker exec        #进入容器后开启一个新的终端,可以在里面操作(常用)
#docker attach         #进入容器正在执行的终端,不会启动新的进程

从容器内拷贝到主机上

docker cp 容器id:容器内路径 目的的主机路径

#查看当前主机目录下
[root@localhost ~]# ls
123.java  123.txt  anaconda-ks.cfg  Desktop  workspace  公共  模板  视频  图片  文档  下载  音乐
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
9b5fc811d7e5   centos    "/bin/bash"   26 minutes ago   Up 26 minutes             strange_dijkstra
#进入docker容器内部
[root@localhost ~]# docker exec -it 9b5fc811d7e5  /bin/bash
[root@9b5fc811d7e5 /]# cd /home/
#在容器内新建一个文件
[root@9b5fc811d7e5 home]# touch test.java
[root@9b5fc811d7e5 home]# ls
test.java
[root@9b5fc811d7e5 home]# read escape sequence
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
9b5fc811d7e5   centos    "/bin/bash"   27 minutes ago   Up 27 minutes             strange_dijkstra
#将这个文件拷贝出来到主机上
[root@localhost ~]# docker cp 9b5fc811d7e5:/home/test.java /home
[root@localhost ~]# cd /home/
[root@localhost home]# ls
cai  test.java  user1

#拷贝是一个手动的过程,后面可以使用 -v 卷的技术,可以实现主机与容器打通

小结

练习

Docker 安装 Nginx

#1.搜索镜像    search  建议去docker官方文档查看
[root@localhost home]# docker search nginx
#2.下载镜像 pull
[root@localhost home]# docker pull nginx

#3.运行测试
[root@localhost home]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    d1165f221234   5 days ago     13.3kB
mysql         latest    c8562eaf9d81   7 weeks ago    546MB
nginx         latest    f6d0b4767a6c   8 weeks ago    133MB
centos        latest    300e315adb2f   3 months ago   209MB
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口:容器内端口
[root@localhost home]# docker run -d --name nginx01 -p 3344:80 nginx
f293c3bb0fe40120c65988da96691662a419d14e18e7560cc4177482df7f9cb5
[root@localhost home]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
f293c3bb0fe4   nginx     "/docker-entrypoint.…"   12 seconds ago   Up 8 seconds    0.0.0.0:3344->80/tcp   nginx01
9b5fc811d7e5   centos    "/bin/bash"              46 minutes ago   Up 46 minutes                          strange_dijkstra
[root@localhost home]# curl localhost:3344

#进入容器
[root@localhost home]# docker exec -it f293c3bb0fe4 /bin/bash
root@f293c3bb0fe4:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@f293c3bb0fe4:/# cd /etc/nginx/
root@f293c3bb0fe4:/etc/nginx# ls
conf.d          koi-utf  mime.types  nginx.conf   uwsgi_params
fastcgi_params  koi-win  modules     scgi_params  win-utf

报错解决

curl localhost:3344
报错:curl: (56) Recv failure: Connection reset by peer

docker是运行在linux上也就是centos系统上的,所以正常来说centos可以ping通由他产生的docker容器,但访问不通。

防火墙也关闭了,但是还是不行,后来重新设置了网卡,就可以了,解决过程如下:

#停止docker
systemctl stop docker
#docker0
ip link set dev docker0 down
#删除docker0网桥
brctl delbr docker0
#增加docker0 网桥
brctl addbr docker0
#增加网卡
ip addr add 172.16.10.1/24 dev docker0
#启用网卡
ip link set dev docker0 up
#重启docker服务
systemctl restart docker

端口暴露的概念

思考问题:我们每次改动nginx配置文件,都需要进入容器内部,十分麻烦,我们要是可以在容器外部提供一个端口映射路径,到达在容器修改文件名,容器内部就可以自动修改? -v 数据卷!

Docker 安装Tomcat

#官方的使用
docker run -it --rm tomcat:9.0

#我们之前的启动都是后台,停止容器之后,容器还是可以查看的到的 docker run -it --rm ,一般用来测试,用完即删

#正常方法(下载在启动)
docker pull tomcat

#启动运行
docker run -d -p 3377:8080 --name tomcat01 tomcat

#测试访问没有问题
进入容器
[root@localhost ~]# docker exec -it tomcat01 /bin/bash

#发现问题:1、linux命令少了。2、没有webapps  阿里云镜像的原因。默认是最小镜像,所有不必要的都被剔除

#保证最小可运行的环境
[root@localhost ~]# docker run -d -p 3377:8080 --name tomcat01 tomcat
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-port=3377/tcp

思考问题:我们以后要部署项目,如果每次都要进入容器是不是非常的麻烦?我们要是在容器外提供一个映射路径,webapps,我们在外部放置项目,就自动同步到内部就好了。

部署es+kibana

#es 暴露的端口很多
#es 十分耗内存
#es 的数据一般需要放置到安全目录!挂载
# --net somenetwork ? 网络配置

#启动 elasticsearch
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

#启动 Linux就卡住了
docker stats 
#查看docker cpu 的状态

#es 是十分号内存的 1.xG 

#查看 docker stats 

#测试一下es 是否成功

#关闭,增加内存的限制,修改配置文件, -e 环境配置修改
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e ES_JAVA_OPTS="-Xms64m -Xmx512m" elasticsearch:7.6.2

使用:使用kibana连接es

posted @ 2021-04-06 11:08  菜鸟-传奇  阅读(791)  评论(0编辑  收藏  举报