Docker入门(一)

Docker概述

开发到上线,会出现各种各样的问题,尤其是“在我电脑上明明可以运行”。从开发到部署上线。

docker给出了解决方案。docker直接打包项目和环境成镜像,可以跨平台直接运行。

什么是docker

docker和传统虚拟机技术的区别

  • 传统虚拟机
    虚拟机是虚拟出一套完整的硬件,运行一个完整的操作系统,软件在此基础上运行。
    在这里插入图片描述

  • docker
    docker的容器技术,容器是运行在宿主机上的,容器没有自己的内核(kernel)也没有虚拟硬件,因此比vm更轻便。容器与虚拟机不同,不需要捆绑一整套操作系统,只需要软件工作所需的库资源和设置。每个容器都是隔离的,文件系统也是隔离的,容器之间互不影响。
    在这里插入图片描述

Docker三要素
在这里插入图片描述

  • 镜像(Images)
    镜像就是一个类,镜像可以创建多个实例(容器服务)。

  • 容器(Containers)
    1、docker通过容器来运行一个独立的环境
    2、容器通过镜像来创建
    3、容器有启动停止删除等命令,容器是互相独立的
    4、容器相当于一个简易版的Linux,

  • 仓库(Repository)
    存放各种镜像的地方,分为公共仓库和私有仓库。
    公共仓库:Docker Hub、阿里云等

安装

环境: centos 7
在这里插入图片描述
官方文档

# 1. 先卸载旧docker
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
# 2. 安装依赖环境
yum install -y yum-utils
# 3. 添加源 国内
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 4. 安装docker、客户端和容器
yum install docker-ce docker-ce-cli containerd.io
# 5. 启动服务
systemctl start docker
docker version # 查看版本信息
# 6. hello world验证docker引擎
docker run 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/

配置镜像加速(国内各个厂商都有教程)
https://cloud.tencent.com/document/product/1207/45596

# 新建一个daemon.json
vim /etc/docker/daemon.json
{
"registry-mirrors": [
  "https://mirror.ccs.tencentyun.com"
]
}
# 重启服务
systemctl daemon-reload
systemctl restart docker

卸载

yum remove docker-ce docker-ce-cli containerd.io
# 主机上的映像,容器,卷或自定义配置文件不会自动删除。要删除所有图像,容器和卷
sudo rm -rf /var/lib/docker

Docker基础知识

从hello-world打印的信息我们可以了解到docker的架构
在这里插入图片描述

docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete 
Digest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323
Status: Downloaded newer image for hello-world:latest
  1. docker先在本地查找hello-world的镜像
  2. 如果没找到就去docker hub查找并拉取镜像文件到本地
  3. docker守护进程通过该镜像生成container实例
  4. 镜像运行可执行文件
  5. 输出通过守护进程传输到docker-cli
  6. 最终输出到终端

docker的基本原理是通过LXC(linux container)来实现的,每个container都可以简单理解成一个linux系统,他们都是互相隔离的,通过docker-cli来操作。

Docker命令

基本命令
docker version	# docker版本信息
docker info		# docker系统信息,镜像和容器
docker <命令> --help # 命令手册

镜像命令

docker images : 查看镜像信息

#  文件源			标签/版本			镜像id				镜像创建时间			镜像大小
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        10 months ago       13.3kB

docker pull : 拉取镜像

[root@VM-0-13-centos docker]# docker pull mysql 
Using default tag: latest	# 不加版本号。默认最新
latest: Pulling from library/mysql
852e50cd189d: Pull complete    			
29969ddb0ffb: Pull complete 
a43f41a44c48: Pull complete 
5cdd802543a3: Pull complete 
b79b040de953: Pull complete 
938c64119969: Pull complete 
7689ec51a0d9: Pull complete 
a880ba7c411f: Pull complete 
984f656ec6ca: Pull complete 
9f497bce458a: Pull complete 
b9940f97694b: Pull complete 
2f069358dc96: Pull complete 
Digest: sha256:4bb2e81a40e9d0d59bd8e3dc2ba5e1f2197696f6de39a91e90798dd27299b093
Status: Downloaded newer image for mysql:latest
[root@VM-0-13-centos docker]# docker pull mysql:5.7
5.7: Pulling from library/mysql		
852e50cd189d: Already exists 			# 这里是先安装了最新版本的mysql
29969ddb0ffb: Already exists 			# 有可以共用的文件
a43f41a44c48: Already exists 			# AUFS技术
5cdd802543a3: Already exists 
b79b040de953: Already exists 
938c64119969: Already exists 
7689ec51a0d9: Already exists 
36bd6224d58f: Pull complete 
cab9d3fa4c8c: Pull complete 
1b741e1c47de: Pull complete 
aac9d11987ac: Pull complete 
Digest: sha256:8e2004f9fe43df06c3030090f593021a5f283d028b5ed5765cc24236c2c4d88e
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7

docker rmi :删除镜像

# 可以输入 repository:tag 也可以输出 id
[root@VM-0-13-centos docker]# docker rmi -f hello-world:latest 
Untagged: hello-world:latest
Untagged: hello-world@sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323
Deleted: sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b
# 删除全部镜像
[root@VM-0-13-centos docker]# docker rmi -f $(docker images -q)

容器命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
可选项 :
-it 以交互方式运行
-d 后台运行
-p 指定容器端口
-p 8000:8080 将主机8000端口映射到容器8080端口
--name=“Name” 给容器取名

# 新建容器并运行
docker pull centos
# 启动容器 Usage:	docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -it 0d120b6ccaa8


[root@VM-0-13-centos docker]# docker run -it 0d120b6ccaa8
[root@7ecb0642d185 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@7ecb0642d185 /]# exit 
exit
[root@VM-0-13-centos docker]# 

docker ps:查看当前运行的容器
-a 所有运行过的容器
-n=?最近运行过的?个容器
-q 只显示容器id

[root@VM-0-13-centos docker]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                         PORTS               NAMES
7ecb0642d185        0d120b6ccaa8        "/bin/bash"         3 minutes ago       Exited (0) 3 minutes ago                           clever_darwin
294f2fa67c65        0d120b6ccaa8        "/bin/bash"         9 minutes ago       Exited (0) 9 minutes ago                           doker_kong
81c4c32e3baa        0d120b6ccaa8        "/bin/bash"         11 minutes ago      Exited (0) 9 minutes ago                           confident_greider
fca03b9e710e        bf756fb1ae65        "/hello"            About an hour ago   Exited (0) About an hour ago 

docker rm 删除容器

docker rm -f $(docker ps -aq) # 删除所有镜像

容器操作

docker start imageId	# 启动容器
docker restart imageId	# 重启
docker stop imageid		# 停止
docker kill image		# 强制停止
常用命令

后台启动容器:docker run -d imageid

[root@VM-0-13-centos docker]# docker run -d centos
8b7bdbf01ca37c17d3fa02d1512af6b0381dc880f5e66b1226165272c483ac0a
[root@VM-0-13-centos docker]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

这里直接用 -d发现并没有后台执行,又或是说是容器运行了,发现这个容器没有应用就会立即停止。
可以使用交互模式启动然后ctrl+p+q不停止容器退出。
在这里插入图片描述
查看日志
docker logs -f -t

查看容器中的进程信息
docker top containerId

查看容器信息
docker inspect containerId
包含信息

  • 基本状态:id,状态,运行参数,镜像地址
  • 驱动信息
  • 挂载信息
  • 环境配置
  • 网络配置
docker inspect 77e901511524
[
    {
        "Id": "77e901511524c3f4751107481eb2f3d82e870a3fee7c2c1cbd2ce6ead14866cb",
        "Created": "2020-11-24T09:49:20.738724928Z",
        "Path": "/bin/bash",
        "Args": [],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 12719,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-11-24T09:49:20.982649504Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:0d120b6ccaa8c5e149176798b3501d4dd1885f961922497cd0abef155c869566",
        "ResolvConfPath": "/var/lib/docker/containers/77e901511524c3f4751107481eb2f3d82e870a3fee7c2c1cbd2ce6ead14866cb/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/77e901511524c3f4751107481eb2f3d82e870a3fee7c2c1cbd2ce6ead14866cb/hostname",
        "HostsPath": "/var/lib/docker/containers/77e901511524c3f4751107481eb2f3d82e870a3fee7c2c1cbd2ce6ead14866cb/hosts",
        "LogPath": "/var/lib/docker/containers/77e901511524c3f4751107481eb2f3d82e870a3fee7c2c1cbd2ce6ead14866cb/77e901511524c3f4751107481eb2f3d82e870a3fee7c2c1cbd2ce6ead14866cb-json.log",
        "Name": "/eloquent_chandrasekhar",
        "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/e1683d428e80ca88404a336fa89f9d5631a0de7d784bb88555a48702a6a213f8-init/diff:/var/lib/docker/overlay2/18b232261ad68f5c398dd37e51250bbf59707c5b83b7a601f491825a3abacf76/diff",
                "MergedDir": "/var/lib/docker/overlay2/e1683d428e80ca88404a336fa89f9d5631a0de7d784bb88555a48702a6a213f8/merged",
                "UpperDir": "/var/lib/docker/overlay2/e1683d428e80ca88404a336fa89f9d5631a0de7d784bb88555a48702a6a213f8/diff",
                "WorkDir": "/var/lib/docker/overlay2/e1683d428e80ca88404a336fa89f9d5631a0de7d784bb88555a48702a6a213f8/work"
            },
            "Name": "overlay2"
        },
        "Mounts": [],
        "Config": {
            "Hostname": "77e901511524",
            "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": "20200809",
                "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": "d2e0ebf46bd945a1bf928ffedbb6291b1b796f122c7b976511a8dd7d96f0db6f",
            "HairpinMode": false,
            "LinkLocalIPv6Address": "",
            "LinkLocalIPv6PrefixLen": 0,
            "Ports": {},
            "SandboxKey": "/var/run/docker/netns/d2e0ebf46bd9",
            "SecondaryIPAddresses": null,
            "SecondaryIPv6Addresses": null,
            "EndpointID": "f002f72568dc22680cb09dfe424f8616b92a756f09c97ea338f514beaf4dfcb6",
            "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,
                    "NetworkID": "dab1a2ec214fd19b4085a937a9764bac166bb03f4162fa8f1f6a72b9baec64c1",
                    "EndpointID": "f002f72568dc22680cb09dfe424f8616b92a756f09c97ea338f514beaf4dfcb6",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

进入后台容器

# 方法1:
# docker exec -it CONTAINER
docker exec -it 77e901511524 /bin/bash

# 方法2:
# Usage:	docker attach [OPTIONS] CONTAINER
# Attach local standard input, output, and error streams to a running container
docker attach 77e901511524 

两者区别:
exec -it会新建一个终端进程,attach则会进入当前正在运行的终端。

容器和主机间文件传输

# 从容器复制到主机
docker cp CONTAINERID:file/path 主机路径
# 从主机到容器
docker cp src/path CONTAINERID:file/path

一张图入门docker常用命令
在这里插入图片描述

第一个容器实例
docker search nginx
# 先拉取一个最新的nginx的镜像
docker pull nginx
# 运行一个容器实例
# -d 后台运行 --name 为实例取名 -p 端口映射
docker run -d --name nginx1 -p 5555:80 nginx
# 查看实例状态
docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
877151d39347        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 1 second         0.0.0.0:5555->80/tcp   nginx1
# 查看实例应用

在这里插入图片描述
如果需要部署项目就通过docker exec / attach进入到容器内部进行修改,不过docker提供了更优秀的解决方案,就是数据卷。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值