Docker入门

 

05节 docker中的名词概念

06节 安装Docker

#01卸载旧版本

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

#02需要的安装包

yum install -y yum-utils

#03 设置腾讯云(阿里云)镜像加速

yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum makecache fast

yum install docker-ce docker-ce-cli containerd.io
systemctl start docker

使用docker --version

docker run hello-world

显示如下, 表示安装成功

表示

docker images

卸载docker
1.卸载依赖

yum remove docker-ce docker-ce-cli containerd.io

2.删除目录

rm -rf /var/lib/docker
rm -rf /var/lib/containerd

docker的默认工作路径:/var/lib/docker

07节 配置腾讯云镜像加速

  1. 执行以下命令,打开 /etc/docker/daemon.json 配置文件。
    vim /etc/docker/daemon.json
  2. 按 i 切换至编辑模式,添加以下内容,并保存。
    {
    "registry-mirrors": [
     "https://mirror.ccs.tencentyun.com"
    ]
    }
  3. 执行以下命令,重启 Docker 即可。示例命令以 CentOS 7 为例。
    sudo systemctl restart docker

08节 Run的流程和Docker原理

通过客户端docker命令到守护进程,通过守护进程去启动容器,操作资源

容器跟linux系统相关隔离,端口外界无法直接访问(eg:localhost:8080,localhost:3061)

09节 镜像的基本命令

docker images -aq

docker search mysql

docker search mysql  --filter=STARS=3000 #搜索stars数超过3000的mysql镜像

docker rmi -f 镜像id #删除指定
docker rmi -f 镜像id  镜像id  镜像id  #删除指定多个镜像
docker rmi -f $(docker images -qa) #删除全部容器镜像

eg:docker  rmi  -f 2fb283157d3c

10节 容器的基本命令

运行并进入容器:docker run -it centos /bin/bash

 

 

删除容器
docker rm 容器id               #删除指定容器,不能删除正在运行中的容器,如果强制删除,用rm -rf
docker rm -f $(docker ps -aq)  #删除所有容器

docker ps -a -q|xargs docker rm #删除所有容器

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

常用其他命令

后台启动容器
docker run -d 镜像名
#问题docker ps,发现centos停止了;
#常见的坑:docker容器使用后台运行,就必须要有一个前台进程(eg:-it),docker 发现没有应用,就会自动停止(没应用,就自杀)
#nginx容器启动后,发现自己没有提供服务,就会立刻停止,就是没有程序了(tomcat可以这么玩)

查看日志
docker run -d centos /bin/bash -c "while true;do echo kuangshen;sleep 1;done"
docker logs -tf --tail 10 addb09ee2801 
 

docker run -d centos /bin/bash -c "while true;do echo kuangshen;sleep 1;done"
查看容器中进程信息
#docker top 容器id

pid:父id

查看镜像中的元数据

命令:docker inspect 容器id
#docker inspect  a489ba50930a


 

[root@VM_0_16_centos ~]# docker inspect  a489ba50930a
[
    {
        "Id": "a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9",
        "Created": "2021-03-24T08:37:43.333345402Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 22991,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2021-03-24T08:37:43.716232265Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55",
        "ResolvConfPath": "/var/lib/docker/containers/a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9/hostname",
        "HostsPath": "/var/lib/docker/containers/a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9/hosts",
        "LogPath": "/var/lib/docker/containers/a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9/a489ba50930a85554665bf4c2f5a9988ab0305d0740da2dfd66424d3d68dfee9-json.log",
        "Name": "/zealous_easley",
        "RestartCount": 0,
        "Driver": "overlay2",
        "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": {
                "LowerDir": "/var/lib/docker/overlay2/0a86e715a7f1cc752b40eceb112e130e48aadb6fe86b42de36687077a3b56c33-init/diff:/var/lib/docker/overlay2/998a87f7085f44d579517bbc31c1e7ed50f596fba0562154890f609f0498ed5a/diff",
                "MergedDir": "/var/lib/docker/overlay2/0a86e715a7f1cc752b40eceb112e130e48aadb6fe86b42de36687077a3b56c33/merged",
                "UpperDir": "/var/lib/docker/overlay2/0a86e715a7f1cc752b40eceb112e130e48aadb6fe86b42de36687077a3b56c33/diff",
                "WorkDir": "/var/lib/docker/overlay2/0a86e715a7f1cc752b40eceb112e130e48aadb6fe86b42de36687077a3b56c33/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "a489ba50930a",
            "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": "d1db6c63680657edd4cc2950425ce576283de63a75bc5d1f56605d0e759df8a4",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/d1db6c636806",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "458af88e9f1dca244eb7356514ebe2d322f1bd61e8dbbd2a34198e6134a72ee7",
            "Gateway": "172.18.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.18.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:12:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "aacc55cb12e85f7680d15f828c04d69cf00785f34cd40a1c344261ccb43cef2c",
                    "EndpointID": "458af88e9f1dca244eb7356514ebe2d322f1bd61e8dbbd2a34198e6134a72ee7",
                    "Gateway": "172.18.0.1",
                    "IPAddress": "172.18.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:12:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]
[root@VM_0_16_centos ~]# 

12 进入容器的命令和拷贝命令

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

#方式一
#命令
docker exec -it 容器id bashShell

#测试

 

#方式二

#命令
docker attach 容器id 
#测试

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

#从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的主机路径  
#容器内拷出来比较常用,外面拷贝进容器一般是通过挂载实现;

#拷贝是个手动过程,未来我们使用-v 卷技术,可以实现,自动同步

学习方式:将我的所有命令全部敲一遍,自己记录铭记;

13 常用命令小结
 

docker的命令十分的多,上面我们学习的那些都是做常用的容器和镜像的命令,之后我们还会学习很多命令;
接下来是一堆得练习

14作业一:部署nginx

docker安装nginx
#1搜索镜像 search 建议大家去docker搜索,可以看到帮助文档;
#2 下载镜像 pull

#03 运行测试
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口:容器内部端口
3344是主机端口,可以开放给公网访问,80是docker容器内部接口;

#端口暴露的概念

#在容器内部是一个单独的小的linux环境,简化版的linux,所以也有防火墙;

15作业二:部署tomcat

安装tomcat
#官方的使用
docker run -it --rm tomcat:9.0
#我们之前的启动都是后台,停了容器后容器还是可以查到,docker run -it --rm tomcat:9.0,一般用来测试,用完即删;#镜像还在,停止时容器自动销毁

#下载启动
docker pull tomcat 
#启动运行
docker run -d -p 3355:8080 --name tomcat01 tomcat

 

16作业三:部署ES+Kibana

#es暴露的端口多,十分耗内存,es的数据一般需要放置到安全目录;
#--net somenetwork网络配置
#启动elasticsearch
#docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:tag
docker run -d --name elasticsearch  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2

#es十分耗内存,1.xG 1核2G
#查看docker stats
#测试es是否成功;

#赶紧关闭,增加内存的测试;

#赶紧关闭,增加内存的测试,-e环境配置修改;

docker run -d --name elasticsearch02  -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms64m  -Xmx512m" elasticsearch:7.6.2

#使用Kibana连接es,思考:网络如何才能连过去;
#容器内部端口互相隔离

17 Protainer可视化面板安装

可视化
#portainer(先用这个)

docker run -d -p 8088:9000  --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

访问测试:http://ip:8080什么是portainer?
docker图形化界面管理工具!提供一个后台面板供我们操作。

#rancher(CI/CD再用)

#进入控制面板

#可视化面板平时很少用,测试玩玩即可

18 镜像原理之联合文件系统

 

所有的应用,直接打包成docker镜像,就可以直接跑起来!
如何获得镜像:
从远程仓库下载;
朋友拷贝给你;
自己制作一个镜像DockerFile

我们下载时看到的一层层的就是介个;

虚拟机是分钟级的,容器是秒级的启动

19 镜像原理之分层下载

分层的镜像
#我们可以去下载一个镜像,注意观察下载的日志输出,可以看到是一层一层下载的。

 

#命令:

 docker image  inspect redis:latest

 

 

20 commit镜像

 

docker commit -a="kuangshen" -m="add webapps app" e71be6fa6e2a tomcat02:1.0

# 测试结果

#分层思想

 

#学习方式说明:理解概念(可以模糊),但是一定要实践,最后实践和理论相结合一次搞定这个知识。

#企业实战
#DockerCompose:yaml一键run所有镜像;
#DockerSwarm:docker 集群;
#CI/CD Jenkins:持续集成,持续部署,流水线


21 容器数据卷的使用

 

总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的!

使用数据卷
方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录

docker run -it  -v /home/ceshi:/home  centos  /bin/bash

#启动起来我们可以通过:docker inspect 容器id

 #测试文件的同步

#停掉docker,linux主机(宿主机)修改test.java,启动docker后,该docker容器的/home/test.java同步修改(容器内的数据依旧是同步的);

好处:我们以后修改只需要在本地修改,容器内会同步修改!

22 实战 Mysql同步数据

思考:mysql的数据持久化问题

#获取镜像

docker pull mysql:5.7

#启动容器时需要做数据挂载,安装启动mysql需要配置密码的
#官方测试
#docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#-d:后台运行;-p:端口映射;-v:数据卷挂载;-e:环境配置;--name:容器名字;

docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d  -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456  --name mysql01 mysql:5.7

#启动成功后,本地使用sqlyog来测试一下;
#sqlyog --h -u -p :连接到服务器的3310和容器内的3306映射,这个时候我们就可以连接上了

#删除容器后,挂载到本地的数据卷依旧没有丢失,这就实现容器数据持久化功能

23 具名和匿名挂载

#匿名挂载
-v 容器路径

docker run -d -P --name nginx01 -v /etc/nginx nginx

#查看所有volume情况
 

docker  volume ls

#具名挂载

docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx 

#通过 -v 卷名:容器内路径
#查看一下这个卷

#docker的工作目录:/var/lib/docker/

#所有docker内的卷,没有指定目录情况下都是放在:/var/lib/docker/volumes/xxx/_data

我们通过具名挂载可以方便找到我们的一个卷,大多数情况都是使用具名挂。

#如何确定是具名挂载,匿名挂载,还是指定路径挂载
-v 容器内路径                #匿名挂载
-v 卷名:容器内路径          #具名挂载
-v /宿主机路径:/容器内路径   #指定路径挂载

拓展
#通过-v 容器内路径:ro rw改变读写权限
ro readonly  #只读
rw readwrite #可读可写
#一旦设置容器权限,容器对我们挂载出来的内容就有限定了;
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
#ro 只要看到ro就说这个路径只能通过宿主机操作,容器内部无法操作!

24 数据卷之Dockerfile

Dockerfile就是用来构建docker镜像的构建文件!命令脚本!体验一下!
(ps:之前我们是通过方式1:commit来构建我们的镜像的)
通过这个脚本可以生成镜像,镜像是一层层的,脚本是一条条命令,每个命令都是一层;

 #创建一个dockerfile文件,名字可以随机,建议Dockerfile
#文件中的内容 指令(大写) 参数
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end---"
CMD /nin/bash

docker build -f /home/docker-test-volume/dockerfile1 -t kuangshen/centos:1.0 .

#这里的每个命令,就是镜像的一层

25 数据卷容器

多个mysql同步数据

 

26 DockerFile介绍

 

Docker容器:就是镜像运行起来提供服务的!

27 dockerfile指令说明

28 实战:构建自己的centos

 

官方的centos是简化版的,很多命令都被删除

#1 编写DockerFile的文件

FROM centos
MAINTAINER kuangshen<24736743@qq.com>
ENV MYPATH  /usr/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

#2 通过这个文件构建镜像
#命令 docker build  -f dockerfile文件路径   -t  镜像名:[tag]

eg:

docker build  -f   mydockerfile-centos -t mycentos:0.1 .

#构建成功标志

#WOKEDIR  $MYPATH  # 一进入docker的目录

#3 测试运行

docker run -it mycentos:0.1

#列出本地镜像的变更历史

#我们平时拿到一个镜像,可以研究下它是怎么做到的,命令:docker history 镜像id

30 实战:DockerFile制作tomcat镜像

 

[root@VM_0_16_centos tomcat]# cat Dockerfile 
FROM centos
MAINTAINER kuangshen<24736743@qq.com>
COPY readme.txt  /usr/localreadme.txt
ADD apache-tomcat-9.0.22.tar.gz   /usr/local
ADD jdk-8u11-linux-x64.tar.gz    /usr/local
RUN yum  -y install vim
ENV MYPATH  /usr/local
WORKDIR  $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH   $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME     /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASH     /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin/:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

docker run  -d  -p 9090:8080 --name kuangshentomcat  -v /home/kuangshen/bulid/tomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test  -v   /home/kuangshen/bulid/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.22/logs diytomcat 

31 发布镜像到DockerHub

32 发布镜像到阿里云服务器上

#登录阿里云

#创建命名空间

命名空间:一般指一个很大项目,而这个项目里会有很多镜像

#创建镜像仓库

 

5 浏览阿里云

33 docker所有流程小结

34 docker0网络详解

 

清空所有环境

 docker run -d -P --name tomcat01 tomcat 
docker exec -it tomcat01 ip addr

#思考,linux能不能ping通容器内部

linux系统ping容器内部,发现可以ping通

docker容器之间ip地址在同一网段(docker0 172.18.0.1/16,tomcat01:172.18.0.2/16 ),彼此间可以ping通。

2.再启动一个容器测试,发现又多了一对网卡

 docker run -d -P  --name tomcat02 tomcat

3.测试下tomcat01和tomcat02能否ping通!

容器tomcat02 ping 容器tomcat01

容器tomcat01 ping 容器tomcat02

#结论:容器和容器之间是可以相互ping通的

#docker0:类似路由器功能(注册or广播:只有目标ip回反馈)

结论:tomcat01和tomcat02是共用一个路由器docker0

所有容器不指定网络情况下,都是docker0路由,docker会给我们容器分配一个默认的可用ip

docker使用的是linux 桥接技术,宿主机中是docker容器的网桥docker0,不指定网络都是docker分配,最多分配65535个ip!

docker中所有的网络接口都是虚拟的,虚拟的转发效率高.

35 容器互联link

#通过--link就可以解决网络连通问题

docker run -d -P --name tomcat03 --link tomcat02 tomcat 

#反向可以ping通吗:不可以

#查看当前网卡详情

docker network inspect  712d72214db9

 

本质探究:--link 就是我们在tomcat03的host配置中增加了一个172.18.0.3    tomcat02 a783de4437e1
现在玩docker已经不建议使用--link了
自定义网络!不支持docker0!
docker0问题:他不支持容器名连接访问。

36 自定义网络

#删除所有容器,保持干净环境

docker rm -f $(docker ps -qa)

#自定义一个网络

#--driver bridge
#--subnet 192.168.0.0/16   192.168.0.2-192.168.255.255
#--gateway 192.168.0.1 路由器的地址

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

#我们自己的网络就创建好了,之后的服务就可以放在我们自己创建的网络里

docker run -d -P --name tomcat-net-01 --net mynet tomcat 
docker run -d -P --name tomcat-net-02 --net mynet tomcat 

 

docker network inspect mynet

#现在不使用--link也可以ping名字了

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值