docker入门

写在最前面

笔记是看了秦老师的视频边实践边整理的。
老师讲的非常好,强烈推荐他的视频!!!!!!!!!!

老师的CSDN

视频链接

使用的是阿里云服务器, 需要配置入站规则什么的 … 百度搜一下就有






docker的安装

docker的基本组成

YsN7CQ.png

使用命令访问docker服务–>镜像下载–>启动容器

镜像(image):

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

容器(container):

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

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

仓库(repository):

仓库即存放镜像的地方,

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

docker hub(默认是国外的)

使用阿里云 进行加速

安装docker

卸载旧的docker:

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

设置仓库,配置加速:

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

更新yum索引:

yum makecache fast

安装docker引擎

1.安装最新版本的docker引擎,容器
$ sudo yum install docker-ce docker-ce-cli contanerd.io
 ce:社区版 ee:企业版

启动docker:

sudo systemctl start docker

基本测试:

docker version

YsNqvn.png

docker run hello-world


[root@iZiiwad3d3m7zzZ ~]# docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is t            he docker daemon running?.
See 'docker run --help'.
[root@iZiiwad3d3m7zzZ ~]# sudo systemctl start docker
[root@iZiiwad3d3m7zzZ ~]# docker run hello-world
Unable to find image 'hello-world:latest' locally # 未在本地仓库找到镜像
latest: Pulling from library/hello-world # 远程下载镜像
0e03bdcc26d7: Pull complete # 下载完毕
Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1 # 校验码
Status: Downloaded newer image for hello-world:latest
# 运行hello-world 容器
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/

卸载docker:

1. 卸载docker引擎,客户端 容器包
sudo yum remove docker-ce docker-ce-cli containerd.io
2.镜像容器等并不是自动删除的,使用下列命令删除
sudo rm -rf /var/lib/docker

底层原理

docker是怎么工作的?

docker是一个CS结构的系统,docekr的守护进程运行在主机上,通过socket从客户端访问。

DockerServer接受客户端的指令,就会执行这个命令

Docker 为什么比VM快?

  1. docker有着比虚拟机更少的抽象层
  2. docker利用的是宿主机的内核,而vm是通过宿主机模拟内核

所以说,新建一个容器的时候,docker不需要像虚拟机一样加载一个操作系统的内核,避免引导(booting),秒级别。虚拟机加载Guest OS 分钟级别、

Docker基本命令

帮助命令

docker version # 显示docker的版本信息
docker info    # 显示docker的系统信息,包括镜像和容器的数量
docker 命令 --help# 帮助命令

镜像命令

docker images :

root@iZiiwad3d3m7zzZ ~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

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

# 可选项

Options:
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests

  -q, --quiet           Only show numeric IDs

# 示例:
docker images -aq 显示本地所有的镜像的id(后面可以用于批量管理的操作)

docker search 搜索镜像

$ docker serach mysql

NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                             MySQL is a widely used, open-source relation…   9500                [OK]
mariadb                           MariaDB is a community-developed fork of MyS…   3444                [OK]

#根据关键词在仓库中搜索镜像并安stars数排序返回

#可选项 过滤
--filter=STARS>3000(只展示stars数大于3000的镜像)


docker pull 下载镜像

# docker pull 镜像名  默认下载最新镜像
# 下载指定版本的镜像: docker pull 镜像名[:tag] 


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)
  -q, --quiet                   Suppress verbose output

----

root@iZiiwad3d3m7zzZ ~$ docker pull mysql


Using default tag: latest # 不写tag 默认最新
latest: Pulling from library/mysql
5b54d594fba7: Pull complete # 分层下载 docker image的核心 联合文件系统
07e7d6a8a868: Pull complete
abd946892310: Pull complete
dd8f4d07efa5: Pull complete
076d396a6205: Pull complete
cf6b2b93048f: Pull complete
530904b4a8b7: Pull complete
fb1e55059a95: Pull complete
4bd29a0dcde8: Pull complete
b94a001c6ec7: Pull complete
cb77cbeb422b: Pull complete
2a35cdbd42cc: Pull complete
Digest: sha256:dc255ca50a42b3589197000b1f9bab2b4e010158d1a9f56c3db6ee145506f625 # 签名
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest # 真实地址

docker pull mysql
等价于
docker pull  docker.io/library/mysql:latest

# 指定 版本下载:
docker pull mysql:5.7



docker rmi 删除镜像

#删除指定id镜像(可一次选择多个id)
docker rmi -f 镜像id[ 镜像id2 ...]
#删除全部镜像
docker rmi -f $(docker images -aq) 

容器命令

说明:本地有了镜像后,才可以创建容器,这里使用一个centos镜像来测试学习

docker pull centos

新建容器并启动

docker run [可选参数] images

# 参数说明
--name="centos1" 指定容器名字用来区分容器
-d 指定后台方式于宁
-it 使用交互方式运行 (进入容器)
-p 指定容器的端口
	使用方式:
	-p ip:主机端口:容器端口
	-p 主机端口:容器端口  (进行映射,使得外部可以通过指定的端口访问容器)
	-p 容器端口
	容器端口
-P 随机指定端口


 # 启动并进入容器
[root@iZiiwad3d3m7zzZ ~]# docker run -it centos /bin/bash
[root@b7c147e9497f /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dev  home  lib64  media       opt  root  sbin  sys  usr
# 通过ls可以看到这就是一个小型的centos环境

退出容器

从容器中退出
exit# 容器停止退出

Ctrl+P+Q #容器不停止退出

列出所有运行中的容器

docker ps
	默认为显示运行中的容器
	-a 查看创建的容器(包括没有在运行的)
	-n=? 显示最近创建的容器 n表示条数
	-q 仅显示创建的容器的id
	
docker ps -aq 查看所有创建的容器的id

删除容器

# 删除指定id的容器
docker rm 容器id # 不能删除正在运行中的容器 强制删除需带上参数 -f
# 递归删除所有的容器
docker rm -f $(docker ps -aq)
docker ps -aq | xargs docker rm 

启动和停止容器的操作

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

常用其他命令

后台启动容器

#通过 -d 后台启动
[root@iZiiwad3d3m7zzZ ~]# docker run -d centos

# 发现centos停止了 

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

查看日志

docker logs
# 参数
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:37) or relative (e.g. 42m for 42
                       minutes)
      --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:37) or relative (e.g. 42m for 42
                       minutes)


 docker logs -f -t --tail 10 2072f1e07af8 # 查看当前日志
 # 后台运行一个bash命令,方便日志查看
 docker run -d centos /bin/sh -c "while true; do echo hahahahaha;sleep 1;done"
 


查看容器中进程的信息

docker top id

[root@iZiiwad3d3m7zzZ ~]# docker top 3c3546037cf0

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                15917               15869               0                   13:00               ?                   00:00:00            /bin/sh -c while true; do echo hahahahaha;sleep 1;done
root                16163               15917               0                   13:02               ?                   00:00:00            /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 1

查看镜像中的元数据

docker inspect


Options:
  -f, --format string   Format the output using the given Go template
  -s, --size            Display total file sizes if the type is container
      --type string     Return JSON for specified type


[root@iZiiwad3d3m7zzZ ~]# docker inspect 3c3546037cf0
[
    {
        "Id": "3c3546037cf03f7c5e9157fd39d296b38012e28f2b145222560add45e5da7158",
        "Created": "2020-05-15T05:00:11.59290732Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while true; do echo hahahahaha;sleep 1;done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 15917,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-05-15T05:00:11.909960416Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:470671670cac686c7cf0081e0b37da2e9f4f768ddc5f6a26102ccd1c6954c1ee",
        "ResolvConfPath": "/var/lib/docker/containers/3c3546037cf03f7c5e9157fd39d296b38012e28f2b145222560add45e5da7158/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/3c3546037cf03f7c5e9157fd39d296b38012e28f2b145222560add45e5da7158/hostname",
        "HostsPath": "/var/lib/docker/containers/3c3546037cf03f7c5e9157fd39d296b38012e28f2b145222560add45e5da7158/hosts",
        "LogPath": "/var/lib/docker/containers/3c3546037cf03f7c5e9157fd39d296b38012e28f2b145222560add45e5da7158/3c3546037cf03f7c5e9157fd39d296b38012e28f2b145222560add45e5da7158-json.log",
        "Name": "/friendly_poitras",
        "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,
            "Capabilities": null,
            "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/2b917cf3c2e309d897e399dd3f89e0f74a0f22610f1ee31cd1ca5c7d266b80d8-init/diff:/var/lib/docker/overlay2/faee309e8065096e7eab52abc94097f6cc5c79a85d223b416f284285f3718410/diff",
                "MergedDir": "/var/lib/docker/overlay2/2b917cf3c2e309d897e399dd3f89e0f74a0f22610f1ee31cd1ca5c7d266b80d8/merged",
                "UpperDir": "/var/lib/docker/overlay2/2b917cf3c2e309d897e399dd3f89e0f74a0f22610f1ee31cd1ca5c7d266b80d8/diff",
                "WorkDir": "/var/lib/docker/overlay2/2b917cf3c2e309d897e399dd3f89e0f74a0f22610f1ee31cd1ca5c7d266b80d8/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "3c3546037cf0",
            "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/sh",
                "-c",
                "while true; do echo hahahahaha;sleep 1;done"
            ],
            "Image": "centos",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "org.label-schema.build-date": "20200114",
                "org.label-schema.license": "GPLv2",
                "org.label-schema.name": "CentOS Base Image",
                "org.label-schema.schema-version": "1.0",
                "org.label-schema.vendor": "CentOS",
                "org.opencontainers.image.created": "2020-01-14 00:00:00-08:00",
                "org.opencontainers.image.licenses": "GPL-2.0-only",
                "org.opencontainers.image.title": "CentOS Base Image",
                "org.opencontainers.image.vendor": "CentOS"
            }
        },
        "NetworkSettings": {
            "Bridge": "",
            "SandboxID": "e40edb2602d86b993490dc754be5f34e44f1ff87ffacd06c2aba8301272ebdbe",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/e40edb2602d8",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "29e0692784a2f86cc2c57d38e23b2e9e59b4dd8643bf97a4b79e57244863de11",
            "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": "0457aba507e30354ba9bf240bd9fe3fb36c2261f1a5e6186b855f80644270f11",
                    "EndpointID": "29e0692784a2f86cc2c57d38e23b2e9e59b4dd8643bf97a4b79e57244863de11",
                    "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 bashshell
[root@iZiiwad3d3m7zzZ ~]# docker exec -it 749fdb83ed84 /bin/bash
[root@749fdb83ed84 /]#

#命令2
docker attach 容器 id


#docker exec 进入容器后打开一个新的终端
#docker attach 进入容器正在执行的终端,不会启动新的终端


从容器中拷贝文件

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

[root@iZiiwad3d3m7zzZ ~]# docker cp 749fdb83ed84:/home/1.txt ./
[root@iZiiwad3d3m7zzZ ~]# ls
1.txt  demo
*

docker 查看cpu占用

docker stats



作业练习

docker 配置Nginx

# 搜索镜像 search
docker search nginx
# 下载镜像 pull
docker pull nginx
# 运行镜像获得容器 run nginx

docker run -d --name nginx01 -p:8888:80 nginx  # 容器80映射到主机8888端口

# 本地测试
curl localhost:8888

#外网访问  
ip:8888

思考: 配置容器都需要进入容器,十分麻烦,如果在容器外部提供一个映射路径,到外部修改相当于容器内部修改 -v 数据卷技术

docker 配置tomcat

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

# 使用 --rm 用完即删除

# 下载进行
docker pull tomcat

#启动运行
docker run -d --name tomcat1 -p 3333:8080 tomcat

#进入容器
docker exec -it tomcat1 /bin/bash

# 官方的tomcat是删减版的,1.删减了linux命令 2.没有默认apps 
# 拷贝一个webapps
cd /usr/local/tomcat
cp -r webapps.dist/* webapps

部署es +kibana

#es 暴露端口很多

#es十分耗内存

#es数据要放置在安全目录

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

# 查看内存占用
docker stats

思考:docker网络原理 ,如何使两个容器相互访问端口

可视化

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

访问端口8088,第一次需要设置用户名密码,登录成功后即可进入容器和镜像的管理页面

下载镜像

docker pull tomcat

#启动运行
docker run -d --name tomcat1 -p 3333:8080 tomcat

#进入容器
docker exec -it tomcat1 /bin/bash

官方的tomcat是删减版的,1.删减了linux命令 2.没有默认apps

拷贝一个webapps

cd /usr/local/tomcat
cp -r webapps.dist/* webapps




> 部署es +kibana

```shell
#es 暴露端口很多

#es十分耗内存

#es数据要放置在安全目录

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

# 查看内存占用
docker stats

思考:docker网络原理 ,如何使两个容器相互访问端口

可视化(了解)

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

访问端口8088,第一次需要设置用户名密码,登录成功后即可进入容器和镜像的管理页面

视频链接

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值