个人自学Linux笔记

1基础操作

命令使用方法

Linux命令格式:

command  [-options]  [parameter1]  …

docker 学习记录

docker是看狂神的视频学习的,所以会出现部分代码示例会出现kuangshen字样。

docker概述

docker为什么出现?应用开发时的环境 

一款产品:开发--上线 两套环境!应用环境,应用配置!
开发 … 运维。 问题:我在我的电脑上可以运行!版本更新,导致服务不可用!对于运维来说,考验就十分大?
环境配置是十分的麻烦,每一个机器都要部署环境(集群Redis、ES、Hadoop.)!费时费力。
发布一个项目(jar+(Redis MySQL jdk ES)),项目能不能都带上环境安装打包!
之前在服务器配置一个应用的环境 Redis MySQL jdk ES Hadoop,配置超麻烦了,不能够跨平台。
Windows,最后发布到 Linux!


传统:开发jar ,运维来做!
现在:开发打包部署上线,一套流程做完!


java - apk-发布 (应用商店)…- 张三使用apk… 安装即可用!
java … jar(环境)…打包项目带上环境(镜像)…(Docker仓库:商店)…. 下载我们发布的镜像 …. 直接运行即可!

Docker 给以上的问题,提出了解决方案!

Docker的思想就来自于集装箱!
JRE - 多个应用(端口冲突)… 原来都是交叉的!
隔离:Docker核心思想!打包装箱!每个箱子是互相隔离的。
水果 生化武器
Docker 通过隔离机制,可以将服务器利用到极致! 

docker历史

2010年,几个搞IT的年轻人,就在美国成立了一家公司dotcloud
做一些 pass 的云计算服务! LXC 有关的容器技术!
他们将自己的技术 (容器化技术) 命名 就是 Docker!
Docker 刚刚诞生的时候,没有引起行业的注意!dotCloud,就活不下去!


开源


开发源代码!
2013年,Docker开源!
Docker越来越多的人发现了docker的优点!火了,Docker 每个月都会更新一个版本!
2014年4月9日,Docker1.0发布!
Docker为什么这么火?十分的轻巧!
在容器技术出来之前,我们都是使用虚拟机技术!
虚拟机:在window中装一个 Vmware,通过这个软件我们可以虚拟出来一台或者多台电脑!笨重!
虚拟机也是属于虚拟化技术,Docker 容器技术,也是一种 虚拟化技术!

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

 Docker 是基于 Go 语言开发的!开源项目!
官网:https://www.docker.com/

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

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

docker能干嘛

容器化技术不是模拟一个完整的操作系统

比较Docker 和 虚拟机技术的不同:
传统虚拟机,虚拟出一条硬件,运行一个完整的操作系统,然后在这个系统上安装和运行软件
容器内的应用直接运行在 宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
·每个容器间是互相隔离,每个容器内都有一个属于自己的文件系统,互不影响。

DevOps (开发、运维)


应用更快速的交付和部署
传统:一堆帮助文档,安装程序
Docker:打包镜像发布测试,一键运行
更使捷的升级和扩缩容
使用了Docker之后,我们部署应用就和搭积木一样!
项目打包为一个镜像,扩展 服务器A! 服务器B
更简单的系统运维
在容器化之后,我们的开发,测试环境都是高度一致的。
更高效的计算资源利用:
Docker 是 内核级别的虚拟化,可以再一个物理机上可以运行很多的容器实例!服务器的性能可以被压榨到极致。

docker基本组成

镜像(image):
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,tomcat镜像===>run ==>tomcat01 容器(提供服务器)
通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。
容器(container):
Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
启动,停止,删除,基本命令!
目前就可以把这个容器理解为就是一个简易的inux系统
仓库(repository):
仓库就是存放镜像的地方!
仓库分为公有仓库和私有仓库!
Docker Hub(默认是国外的)
阿里云….都有容器服务器(配置镜像加速!)

安装docker

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
$ sudo yum-config-manager\
 --add-repo\
 https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3安装docker

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

4启动docker

sudo systemctl start docker

使用docker version测试是否安装成功

5测试

sudo docker run hello-world

[root@localhost ~]# sudo docker run hello-world
Unable to find image 'hello-world:latest' locally #没有找到,去官方仓库拉取
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete 
Digest: sha256:266b191e926f65542fa8daaec01a192c4d292bff79426f47300a046e1bc576fd
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

查看一下这个镜像

[root@localhost ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
hello-world   latest    d2c94e258dcb   12 months ago   13.3kB

回顾一下helloworld流程

docker run流程

 镜像命令

 

 

容器命令

容器对外隔离,需要映射,前为宿主机端口,后为容器端口。

以交互进入centos容器,用bash交互形式

 

常用其他命令

后台启动容器 

查看日志

docker logs -f -t --tail 容器没有日志
#自己写个shell脚本
[root@localhost ~]# docker run -d centos /bin/bash -c "while true;do echo hello;sleep 1;done"
#列出正常运行的容器

docker ps
CONTAINER ID   IMAGE          
75cc6dc60f1f   centos   

#显示日志
-tf    #显示日志
--tail number #要显示多少行

docker logs -ft --tail 10 75cc6dc60f1f 

 查看容器的进程

docker top 容器id
[root@localhost ~]# docker top 75cc6dc60f1f
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                9377                9336                0                   14:01               ?                   00:00:00            /bin/bash -c while true;do echo hello;sleep 1;done
root                9806                9377                0                   14:07               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

查看容器的元数据

[root@localhost ~]# docker inspect 75cc6dc60f1f
[
    {
        "Id": "75cc6dc60f1fcea991a9e4b2c51733758a3cf707d6772266e8c481e9cf35968f",
        "Created": "2024-05-21T06:01:27.614848981Z",
        "Path": "/bin/bash",
        "Args": [
            "-c",
            "while true;do echo hello;sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 9377,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2024-05-21T06:01:27.817787665Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6",
        "ResolvConfPath": "/var/lib/docker/containers/75cc6dc60f1fcea991a9e4b2c51733758a3cf707d6772266e8c481e9cf35968f/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/75cc6dc60f1fcea991a9e4b2c51733758a3cf707d6772266e8c481e9cf35968f/hostname",
        "HostsPath": "/var/lib/docker/containers/75cc6dc60f1fcea991a9e4b2c51733758a3cf707d6772266e8c481e9cf35968f/hosts",
        "LogPath": "/var/lib/docker/containers/75cc6dc60f1fcea991a9e4b2c51733758a3cf707d6772266e8c481e9cf35968f/75cc6dc60f1fcea991a9e4b2c51733758a3cf707d6772266e8c481e9cf35968f-json.log",
        "Name": "/wizardly_swirles",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
        "MountLabel": "",
        "ProcessLabel": "",
        "AppArmorProfile": "",
        "ExecIDs": null,
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "bridge",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            "AutoRemove": false,
            "VolumeDriver": "",
            "VolumesFrom": null,
            "ConsoleSize": [
                16,
                103
            ],
            "CapAdd": null,
            "CapDrop": null,
            "CgroupnsMode": "private",
            "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",
            "Isolation": "",
            "CpuShares": 0,
            "Memory": 0,
            "NanoCpus": 0,
            "CgroupParent": "",
            "BlkioWeight": 0,
            "BlkioWeightDevice": [],
            "BlkioDeviceReadBps": [],
            "BlkioDeviceWriteBps": [],
            "BlkioDeviceReadIOps": [],
            "BlkioDeviceWriteIOps": [],
            "CpuPeriod": 0,
            "CpuQuota": 0,
            "CpuRealtimePeriod": 0,
            "CpuRealtimeRuntime": 0,
            "CpusetCpus": "",
            "CpusetMems": "",
            "Devices": [],
            "DeviceCgroupRules": null,
            "DeviceRequests": null,
            "MemoryReservation": 0,
            "MemorySwap": 0,
            "MemorySwappiness": null,
            "OomKillDisable": null,
            "PidsLimit": null,
            "Ulimits": [],
            "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",
                "/sys/devices/virtual/powercap"
            ],
            "ReadonlyPaths": [
                "/proc/bus",
                "/proc/fs",
                "/proc/irq",
                "/proc/sys",
                "/proc/sysrq-trigger"
            ]
        },
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/88eb9556e67dd901757c02eef06b1d729be9aaf54ceaa44cee66a2ceeb1753f0-init/diff:/var/lib/docker/overlay2/e3b1ce9f2935a7707885b1bda9f385644da512864f68e7e48e185d4cce4f18a1/diff",
                "MergedDir": "/var/lib/docker/overlay2/88eb9556e67dd901757c02eef06b1d729be9aaf54ceaa44cee66a2ceeb1753f0/merged",
                "UpperDir": "/var/lib/docker/overlay2/88eb9556e67dd901757c02eef06b1d729be9aaf54ceaa44cee66a2ceeb1753f0/diff",
                "WorkDir": "/var/lib/docker/overlay2/88eb9556e67dd901757c02eef06b1d729be9aaf54ceaa44cee66a2ceeb1753f0/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "75cc6dc60f1f",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "/bin/bash",
                "-c",
                "while true;do echo hello;sleep 1;done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20210915",
                "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": "3a65625c250dcdf6275144576195f975c9d74186019c1d1e8d303fdcb6ce9831",
            "SandboxKey": "/var/run/docker/netns/3a65625c250d",
            "Ports": {},
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "7b5a99d4adebd8305ac8da729d5a844950069fe05d3b78cbea095b293f973d08",
            "Gateway": "172.17.0.1",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "IPAddress": "172.17.0.2",
            "IPPrefixLen": 16,
            "IPv6Gateway": "",
            "MacAddress": "02:42:ac:11:00:02",
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "MacAddress": "02:42:ac:11:00:02",
                    "NetworkID": "4c11daeebcb420b638be79900141534884a2cee1da3bf60061b52e9c14408921",
                    "EndpointID": "7b5a99d4adebd8305ac8da729d5a844950069fe05d3b78cbea095b293f973d08",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "DriverOpts": null,
                    "DNSNames": null
                }
            }
        }
    }
]

进入当前正在运行的容器

#进入容器,修改配置

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

[root@localhost ~]# docker exec -it 75cc6dc60f1f /bin/bash
[root@75cc6dc60f1f /]# ls
bin  etc   lib	  lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr

#方式二
docker attach 容器id
正在执行当前的代码......

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

从容器拷贝文件到主机

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

#在容器中创建一个文件
[root@localhost ~]# docker attach 702ef2c0d4a1
[root@702ef2c0d4a1 home]# touch lubo.txt
[root@702ef2c0d4a1 home]# exit
#复制到主机中
[root@localhost ~]# docker cp 702ef2c0d4a1:/home/lubo.txt /home
Successfully copied 1.54kB to /home

小结

 docker 的命令很多,上面的都是常用的。

练习

docker安装

docker安装 Nginx

1、搜索镜像 search
2、下载镜像 pull 
3、查看镜像 docker images

部署容器
[root@localhost ~]# docker run -d --name nginx01 -p 3344:80 nginx
8cdf0592510d15c93ae9a4ba8e6f523efef354389094d88f39d198471bf369c6
[root@localhost ~]# curl localhost:3344
启动容器
[root@localhost ~]# docker exec -it nginx01 /bin/bash
root@97f65f7ab4ca:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@97f65f7ab4ca:/# cd /etc/nginx/
root@97f65f7ab4ca:/etc/nginx# ls
conf.d	fastcgi_params	mime.types  modules  nginx.conf  scgi_params  uwsgi_params



 端口暴露docker里的80映射3344

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

docker安装tomcat

#官方的使用

官网版本 
docker run -it --rm tomcat:9.0
#用完以后就删除

#正常安装
docker pull tomcat

#查看镜像
docker images

#启动
docker run -d -p 3355:8080 --name tomcat01 tomcat

 docker数据卷

数据卷挂载
问题:在容器里都像是精简的化的小系统一样的地方,想要修改容器里的东西,容器里甚至连vim都没有,此时,就要使用上数据卷这个东西。
 数据卷(volume)是一个虚拟目录,是容器内目录宿主机目录之间映射的桥梁
下图为容器内的文件通过数据集使其能在宿主机一个确定的文件夹下面操作和修改。

数据卷命令

创建卷以后宿主机自动创建相关宿主机目录。


练习1

 在创建容器时做挂载

 实验举例,创建一个nginx,在容器外面对容器内的配置进行修改

[root@localhost ~]# docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
5010f97e48407a2753787b45cb6140dbdb2ba0e0d5ecb86db6d90255312f5a89
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
5010f97e4840   nginx     "/docker-entrypoint.…"   4 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx
[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     html
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS                      PORTS                                       NAMES
5010f97e4840   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes                0.0.0.0:80->80/tcp, :::80->80/tcp           nginx
0e1165852b3b   tomcat    "catalina.sh run"        29 hours ago    Exited (255) 24 hours ago   0.0.0.0:3355->8080/tcp, :::3355->8080/tcp   tomcat01
702ef2c0d4a1   centos    "/bin/bash"              12 days ago     Exited (0) 12 days ago                                                  peaceful_wilson
[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     html
[root@localhost ~]# docker volume inspect html
[
    {
        "CreatedAt": "2024-06-02T21:16:34+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/html/_data",
        "Name": "html",
        "Options": null,
        "Scope": "local"
    }
]

 此时就可以在容器外进行nginx的修改

[root@localhost ~]# cd /var/lib/docker/volumes/html/_data/
[root@localhost _data]# ls
50x.html  index.html
[root@localhost _data]# 

练习2

docker inspect
#可查看是否有数据卷挂载

容器创建默认创建匿名卷, mysql会将数据文件挂载,应该使数据和容器分离。 

示范:

将相应的目录挂载到宿主机,实现数据容器分离

自定义镜像

镜像就是包含了应用程序、程序运行的系统函数库、运行配置等文件的文件包。构建镜像的过程其实就是把上述文件打包的过程。

docker镜像制作分层形式 ,很多层是通用的,可以共享某些基础层,如果下载俩个不同镜像,遇见相同层时,会跳过下载。

Dockerfile

 编写好dockerfile以后,可以利用下面命令来构建镜像

docker build -t myImage:1.0 .
#-t:是给镜像起名,格式依然是repository:tag的格式,不指定tag时,默认为latest
#.: 是指定Dockerfile所在目录,如果就在当前目录则指定为"."

docker网络

 

例如:设置一个自定义网络连接centos和nginx,再进入centos进行ping测试,实现ping名字互通

docker network create heima
d7aa3c7a25c89eebba092c2f42d433891e07a6249d2e186e51154b0793b9dfc8

[root@localhost ~]# docker network connect heima nginx
[root@localhost ~]# docker network connect heima 702ef2c0d4a1
[root@localhost ~]# docker exec -it 702ef2c0d4a1  bash
[root@702ef2c0d4a1 /]# ping nginx
PING nginx (172.18.0.2) 56(84) bytes of data.
64 bytes from nginx.heima (172.18.0.2): icmp_seq=1 ttl=64 time=0.126 ms
64 bytes from nginx.heima (172.18.0.2): icmp_seq=2 ttl=64 time=0.071 ms
64 bytes from nginx.heima (172.18.0.2): icmp_seq=3 ttl=64 time=0.071 ms
64 bytes from nginx.heima (172.18.0.2): icmp_seq=4 ttl=64 time=0.058 ms


案例

java应用,将jar包打包好,然后将dockerfile一起放到宿主机,然后输入命令

docker build -t 镜像名 .

镜像创建好以后,新建容器即可运行该项目

 部署静态资源nginx,创建容器,java与mysql需要进行互联

Docker Compose

Docker Compose通过一个单独的docker-compose.yml模板文件(YAML格式)来定义一组相关联的应用容器,帮助我们实现多个相互关联的Docker容器的快速部署。

使用类似dockerfile,描述的信息几乎一样
实例:
 

  

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值