Docker的常用命令
常用命令
docker version #显示docker的版本信息
docker info #显示docker的系统信息,包括镜像和容器的数量
docker命令 --he1p #帮助命令
帮助文档的地址:https://docs.docker.com/engine/reference/run/
如果要使用 Docker 作为非 root 用户,怎么办?
如果您希望以非 root 用户的身份使用 Docker,可以按照以下步骤进行配置:
-
将用户添加到 Docker 用户组:
默认情况下,只有 root 或者在 sudoers 列表中的用户才能运行 Docker 命令。为了允许其他用户访问 Docker 命令,可以将这些用户添加到 Docker 用户组中。sudo usermod -aG docker your_username
将 “your_username” 替换为您想要添加到 Docker 组的用户名。
-
重新登录或重新加载组:
添加用户到 Docker 用户组后,为了生效,您需要重新登录系统,或者重新加载组:newgrp docker # 或者重新登录系统
-
测试 Docker 权限:
运行一个 Docker 命令测试一下是否成功以非 root 用户的身份访问 Docker:docker run hello-world
通过将用户添加到 Docker 用户组,您就可以允许这些用户在不使用 sudo 的情况下运行 Docker 命令。请注意,这可能会涉及一些安全风险,因此务必谨慎地将用户添加到 Docker 组,并确保了解他们所能执行的操作。
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
这些是典型的 Linux 系统目录结构。在 Linux 系统中,这些目录用于组织文件和系统资源。
- bin: 存放二进制可执行文件,常用的命令(如ls、cp)通常位于此处。
- boot: 包含启动系统所需的文件,如引导加载程序、内核和启动时使用的配置文件。
- dev: 是特殊文件的存放位置,包括设备文件,它们用于与硬件设备进行通信。
- etc: 包含系统范围的配置文件,例如网络配置、软件包管理器的配置等。
- home: 用户的家目录,每个用户通常拥有一个自己的子目录。
- lib, lib32, lib64, libx32: 存放库文件,用于支持程序的运行和链接。
- media: 用于挂载可移动媒体设备(如USB驱动器、光盘等)的挂载点。
- mnt: 用于临时挂载文件系统或其他设备的目录。
- opt: 用于安装额外的软件包的目录,通常由用户安装的应用程序存放于此。
- proc: 虚拟文件系统,提供系统和进程信息的接口,可以通过读取文件和目录来获取系统信息。
- root: root用户的家目录。
- run: 包含在系统启动时创建的运行时信息,如PID文件和套接字文件。
- sbin: 存放系统管理员(root)使用的系统命令。
- srv: 用于存放服务数据的目录,如HTTP、FTP等服务的数据。
- sys: 包含系统硬件和内核信息的虚拟文件系统。
- tmp: 用于存放临时文件的目录。
- usr: 包含用户程序和文件的目录。
- var: 包含经常变化的文件,如日志文件、缓存文件等。
这些目录有助于在 Linux 系统中组织文件、管理资源和提供系统服务。每个目录都有其特定的用途,有助于使 Linux 系统更有序、更易于管理。
镜像命令
docker images 查看所有本地主机上的镜像
# docker images 和 docker images -a
root@ubuntu:~# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 18 months ago 13.3kB
#解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的id
CREATED 镜像的创建时间
SIZE 镜像的大小
#可选项
-a,--a11 #列出所有镜像
-q,--quiet #只显示镜像的id
docker search 搜索镜像
root@ubuntu:~# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 14028 [OK]
mariadb MariaDB Server is a high performing open sou… 5352 [OK]
#可选项, 通过搜藏来过滤
--filter-STARS=3000 # 搜索出来的镜像就是STARS大于3000的
root@ubuntu:~# docker search mysql --filter=STARS=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 14028 [OK]
mariadb MariaDB Server is a high performing open sou… 5352 [OK]
docker pull 下载镜像
#下载境像docker pul1镜像名[:tag]
[rootekuangshen /]# docker pull mysql
using default tag: latest # 如果不写tag. 默认就是latest
latest: Pulling from lbrary/mysq1
5b54d594fba7: Pu11 complete #分层下载,docker iamge的核心联合文件系统
07e7d6a8a868: Pu11 complete
abd946892310: Pu11 complete
dd8f4d07efa5: Pul1 complete
076d396a6205: Pu11 complete
cf6b2b93048f: Pul1 complete
530904b4a8b7: Pu11 complete
fble55059a95: Pul1 complete
4bd29a0dcde8: Pu11 complete
b94a001c6ec7: Pu11 complete
cb77cbeb422b: Pu11 complete
2a35cdbd42cc: Pu11 complete
Digest: sha256 :dc255caS0a42b3589197000b1 f9bab2b4e010158d1a9f56c3db6ee145506f625 #签名
Status: Downloaded newer image for mysql:latest
docker. io/library/mysq1:latest #真实地址
#等价于它
docker pull mysql
docker pull docker.io/library/mysql:latest
#指定版本下载
root@ubuntu:~# docker pull mysql:5.7
5.7: Pulling from library/mysql
72a69066d2fe: Pull complete
93619dbc5b36: Pull complete
99da31dd6142: Pull complete
626033c43d70: Pull complete
37d5d7efb64e: Pull complete
ac563158d721: Pull complete
d2ba16033dad: Pull complete
0ceb82207cd7: Pull complete
37f2405cae96: Pull complete
e2482e017e53: Pull complete
70deed891d42: Pull complete
Digest: sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
root@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 412b8cc72e4a 5 days ago 531MB
mysql 5.7 c20987f18b13 15 months ago 448MB
hello-world latest feb5d9fea6a5 18 months ago 13.3kB
docker rmi 删除镜像
[rootakuangshen /]# docker rmi -f 容器id # 删除指定的容器
[root@kuangshen /]# docker rmi -f 容器id 容器id 容器id 容器id # 删除多个容器
[rootakuangshen /]# docker rmi -f $(docker images -aq) #删除全部的容器
docker load 加载镜像
语法
docker load [OPTIONS]
OPTIONS 说明:
- –input , -i : 指定导入的文件,代替 STDIN。
- –quiet , -q : 精简输出信息。
# docker load -i /home/moran/ubuntu.tar
docker load -i 镜像容器路径
docker save 保存镜像
docker save : 将指定镜像保存成 tar 归档文件。
语法
docker save [OPTIONS] IMAGE [IMAGE...]
OPTIONS 说明:
- **-o 😗*输出到的文件。
实例
将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档
runoob@runoob:~$ docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
runoob@runoob:~$ ll my_ubuntu_v3.tar
-rw------- 1 runoob runoob 142102016 Jul 11 01:37 my_ubuntu_v3.ta
容器命令
说明:我们有了镜像才可以创建容器. linux.下载一个 ubuntu 镜像来测试学习
docker pull ubuntu
为什么docker容器的网络跟宿主机的不一样?
kongming20@ubuntu:~$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:e1ff:fe7e:c653 prefixlen 64 scopeid 0x20<link>
ether 02:42:e1:7e:c6:53 txqueuelen 0 (Ethernet)
RX packets 3655 bytes 162913 (162.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3966 bytes 53093806 (53.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.109 netmask 255.255.255.0 broadcast 192.168.1.255
ether 00:0c:29:6e:0c:d8 txqueuelen 1000 (Ethernet)
RX packets 324895 bytes 458674629 (458.6 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 73696 bytes 5335572 (5.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 1529 bytes 140766 (140.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1529 bytes 140766 (140.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth33f79ef: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::38b9:d7ff:fe99:2fd0 prefixlen 64 scopeid 0x20<link>
ether 3a:b9:d7:99:2f:d0 txqueuelen 0 (Ethernet)
RX packets 3655 bytes 214083 (214.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3997 bytes 53096857 (53.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@27346d8b24d1:/# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 3997 bytes 53096857 (53.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3655 bytes 214083 (214.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
在默认情况下,Docker 使用自己的网络桥接来连接容器,因此容器分配的 IP 地址通常与宿主机的 IP 地址不同。
docker0
是 Docker 的默认网络桥接,用于连接 Docker 容器和宿主机。当 Docker 启动时,会在主机上创建一个名为 docker0
的虚拟网桥。这个网桥允许容器连接到宿主机,并提供网络访问和通信。容器被分配在 docker0
网络的子网中,一般默认情况下是 172.17.0.0/16
网段。
docker0
的 IP 地址 172.17.0.1
是该虚拟网桥在宿主机上的地址,它作为 Docker 的默认网关地址,用于容器之间和容器与宿主机之间的通信。容器会从这个子网中分配 IP 地址。
这种默认的网络配置允许 Docker 管理和隔离容器的网络,同时为容器提供通信和外部访问的途径。
当启动容器后,我能通过ssh连接到容器嘛?
可以通过 SSH 连接到运行中的容器,但要注意几个方面:
-
容器中是否有 SSH 服务: 首先,确保容器内安装了 SSH 服务。如果容器中没有安装 SSH 服务,您将无法通过 SSH 连接。
-
SSH 端口的映射: 如果容器内运行了 SSH 服务,确保容器的 SSH 端口映射到宿主机上。启动容器时,可以通过
-p
参数将容器的 SSH 端口映射到宿主机的某个端口上。例如,要将容器内的 SSH 服务映射到宿主机的 2222 端口,可以在启动容器时使用以下命令:
docker run -p 2222:22 -d image_name
其中
-p 2222:22
将容器内的 SSH 端口 22 映射到宿主机的 2222 端口上。 -
连接容器: 一旦容器内运行了 SSH 服务并映射了端口,您可以使用 SSH 客户端连接到容器。连接时需要使用容器的 IP 地址或者宿主机的 IP 地址和映射的端口号。
ssh user@container_ip -p mapped_port
将
user
替换为您的用户名,container_ip
替换为容器的 IP 地址,mapped_port
替换为映射的端口号。
在确保容器内有 SSH 服务运行且端口映射设置正确的情况下,您就可以通过 SSH 连接到运行中的容器。
容器内的systemctl不可用?
这个错误是因为在容器内部运行了 systemctl
命令,但容器内并未使用 systemd
作为初始化系统。在容器内,通常不会像在常规的 Linux 主机上那样使用 systemd 这样的 init 系统。
在容器中执行 systemctl
命令通常无法直接控制服务,因为容器通常会使用单个应用程序来作为其主要进程,并且容器的生命周期与这个应用程序的生命周期相关联。因此,控制服务、启动和停止服务等通常是通过应用程序本身的命令或管理脚本来完成。
如果要管理 SSH 服务,您可以使用 SSH 服务的原生命令来启动、停止或重新加载服务。例如,对于 OpenSSH 服务,您可以使用以下命令来启动 SSH 服务:
service ssh start
或者,如果您使用的是不同的 SSH 服务,可能需要使用适当的命令来启动服务。请记住,在容器中,您可能需要以 root 或具有相应权限的用户身份来执行这些操作。
新建容器并启动
docker run [可选参数] image
#参数说明
--name-"Name" 容器名字tomcat01 tomcat02. 用来区分容器
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定容器的端口-p 8080:8080
-p ip:主机端口:容器端口
-p 主机端口:容器端口 (常用)
-p 容器端口:容器端口
-P 随机指定端口
root@ubuntu:~# docker run -it ubuntu /bin/bash
root@0704e61145f4:/# ls #查看容器内的ubuntu,基础版本,很多命令都是不完善的!
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
#从容器中返回主机
root@0704e61145f4:/# exit
exit
列出所有运行的容器
root@ubuntu:/# docker ps(默认显示正在运行的容器)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
root@ubuntu:/# docker ps -a(显示所有的容器)
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0704e61145f4 ubuntu "/bin/bash" 33 minutes ago Exited (0) 29 minutes ago unruffled_solomon
30f905eed98d feb5d9fea6a5 "/hello" 24 hours ago Exited (0) 24 hours ago affectionate_blackburn
退出容器
exit # 直接容器停止并退出
ctrl + P + Q #容器不停止退出
删除容器
docker rm 容器id #删除指定的容器,不能删除正在运行的容器,如果要强制删除 rm -f
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容器
-
查找容器
docker ps -a
-
确定我们的容器名,并获取容器长ID
docker inspect -f 容器id或者容器
-
拷贝本地文件到容器
docker cp 你的文件路径 容器长ID:docker容器路径
-
例子:
moran778@moran:/mnt/d/桌面/交换机软件组/源码$ docker cp ./openlldp-master 0ff05f33707b807246c3594f84f2c615308d5dfefedd1fa4a0e158e661368c08:/home/moran/code Successfully copied 2.96MB to 0ff05f33707b807246c3594f84f2c615308d5dfefedd1fa4a0e158e661368c08:/home/moran/code
-
最后,进入容器查看是否成功拷贝
root@0ff05f33707b:/home/moran/code# ls openlldp-master
常用其他命令
后台启动容器
#命令 docker run -d 镜像名!
[root@kuangshen /]# docker run -d centos #问题docker ps,发现centos停止了
#常见的坑: docker 容器使用后台运行。就必须要有要一个前台进程。docker发现没有应用。就会自动停止
# nginx.容器启动后,发现自己投有提供服务,就会立刻停止,就是没有程序了
查看日志
docker logs -f -t --tail # 容器,没有日志
# 己编写一段she11脚本
root@ubuntu:/# docker run -d ubuntu /bin/sh -c "while true;do echo kuangshen;sleep 1;done"
root@ubuntu:/# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
608d8b9678d1 ubuntu "/bin/sh -c 'while t…" 10 seconds ago Up 7 seconds hardcore_sinoussi
# 显示日志
-tf # 显示日志
--tai1 number # 要显示日志条数
root@ubuntu:/# docker logs -tf --tail 10 608d8b9678d1
查看容器中进程信息ps
#命令 docker top 容器id
root@ubuntu:/# docker top 608d8b9678d1
UID PID PPID C STIME TTY TIME CMD
root 11169 11136 0 05:00 ? 00:00:00 /bin/sh -c while true;do echo kuangshen;sleep 1;done
root 11592 11169 0 05:05 ? 00:00:00 sleep 1
查看镜像的元数据
#命令
docker inspect 容器id
#测试
root@ubuntu:/# docker inspect 608d8b9678d1
[
{
"Id": "608d8b9678d162d2adc546ca14637d7986374e0b530f070c9efa9799424ac1d5",
"Created": "2023-04-12T12:00:15.394719245Z",
"Path": "/bin/sh",
"Args": [
"-c",
"while true;do echo kuangshen;sleep 1;done"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 11169,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-04-12T12:00:17.470433737Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:ba6acccedd2923aee4c2acc6a23780b14ed4b8a5fa4e14e252a23b846df9b6c1",
"ResolvConfPath": "/var/lib/docker/containers/608d8b9678d162d2adc546ca14637d7986374e0b530f070c9efa9799424ac1d5/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/608d8b9678d162d2adc546ca14637d7986374e0b530f070c9efa9799424ac1d5/hostname",
"HostsPath": "/var/lib/docker/containers/608d8b9678d162d2adc546ca14637d7986374e0b530f070c9efa9799424ac1d5/hosts",
"LogPath": "/var/lib/docker/containers/608d8b9678d162d2adc546ca14637d7986374e0b530f070c9efa9799424ac1d5/608d8b9678d162d2adc546ca14637d7986374e0b530f070c9efa9799424ac1d5-json.log",
"Name": "/hardcore_sinoussi",
"RestartCount": 0,
"Driver": "overlay2",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "docker-default",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"ConsoleSize": [
39,
66
],
"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",
"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": 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/a159027172c4210ef74063f14b2e670e148e92abe3d63c6464bd223572989d14-init/diff:/var/lib/docker/overlay2/df299b57616369297db53d74e6fb534ca7f8638b6ea569d68bffc3d322e37c0d/diff",
"MergedDir": "/var/lib/docker/overlay2/a159027172c4210ef74063f14b2e670e148e92abe3d63c6464bd223572989d14/merged",
"UpperDir": "/var/lib/docker/overlay2/a159027172c4210ef74063f14b2e670e148e92abe3d63c6464bd223572989d14/diff",
"WorkDir": "/var/lib/docker/overlay2/a159027172c4210ef74063f14b2e670e148e92abe3d63c6464bd223572989d14/work"
},
"Name": "overlay2"
},
"Mounts": [],
"Config": {
"Hostname": "608d8b9678d1",
"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 kuangshen;sleep 1;done"
],
"Image": "ubuntu",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "e44f4ae462cc9e9bdb414cb4725681e2d4a94a9ef529c41d252533ed80af6573",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/e44f4ae462cc",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "6239f2b47771a4ada314f2cd56c12f6b993b7f2cb70c754897e4705d94867532",
"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": "0decb42a50bfe277c9ad1f87691fbe49fc4af04b910b41b08c14f85ebf4648a9",
"EndpointID": "6239f2b47771a4ada314f2cd56c12f6b993b7f2cb70c754897e4705d94867532",
"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
}
}
}
}
]
进入当前正在运行的容器
# 我们通常容器都是使用后台方式运行的。需要进入容器。修改一些配置
# 命令
docker exec -it 容器id bashshell
# 测试
root@ubuntu:/# docker exec -it 608d8b9678d1 /bin/bash
root@608d8b9678d1:/# ls
bin dev home lib32 libx32 mnt proc run srv tmp var
boot etc lib lib64 media opt root sbin sys usr
root@608d8b9678d1:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12:00 ? 00:00:00 /bin/sh -c wh
root 933 0 0 12:15 pts/0 00:00:00 /bin/bash
root 965 1 0 12:16 ? 00:00:00 sleep 1
root 966 933 0 12:16 pts/0 00:00:00 ps -ef
# 方式二
docker attach 容器id
# 测试
root@ubuntu:/# docker attach 608d8b9678d1
正在执行当时的代码...
# docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)
# docker attach #进入容器正在执行的终端,不会启动新的进程!
从容器内拷贝文件到主机上
docker cp 容器id:容器内路径 目的的主机路径
#查看当前主机目录下
root@ubuntu:/home# ls
ernest-laptop moran.java
root@ubuntu:/home# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3552be50363 ubuntu "/bin/bash" 5 minutes ago Exited (0) 9 seconds ago busy_murdock791b8ab3f469 ubuntu "/bin/bash" 8 minutes ago Exited (127) 7 minutes ago competent_colden
#进入到docker容器内部
root@ubuntu:/home# docker attach a3552be50363
root@a3552be50363:/# cd /home
#在容器内新建一个文件
root@a3552be50363:/home# touch test.java
root@a3552be50363:/home# ls
test.java
root@a3552be50363:/# exit
root@ubuntu:/home# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3552be50363 ubuntu "/bin/bash" 5 minutes ago Exited (0) 9 seconds ago busy_murdock791b8ab3f469 ubuntu "/bin/bash" 8 minutes ago Exited (127) 7 minutes ago competent_colden
#将这个文件拷贝出来到主机上
root@ubuntu:/home# docker cp a3552be50363:/home/test.java /home
Successfully copied 1.536kB to /home
root@ubuntu:/home# ls
ernest-laptop moran.java test.java
#拷贝是一个手动过程,未来我们使用 -V 卷的技术,可以实现!
小结
attach Attach to a running container # 当前 shell 下 attach 连接指定运行镜像
build Build an image from a Dockerfile # 通过 Dockerfile 定制镜像
commit Create a new image from a container changes # 提交当前容器为新的镜像
cp Copy files/folders from the containers filesystem to the host path #从容器中拷贝指定文件或者目录到宿主机中
create Create a new container # 创建一个新的容器,同run 但不启动容器
diff Inspect changes on a container's filesys tem # 查看docker容器变化
events Get real time events from the server # 从docker 服务获取容器实时事件
exec Run a command in an existing container # 在已存在的容器上运行命令
export Stream the contents of a container as a tar archive # 导出容器的内容流作为一个 tar 归档文件[对应 import ]
history Show the history of an inage # 展示一个镜像形成历史
images List images # 列出系统当前镜像
Create a new filesystem image from the contents of a tarball # 从 tar 包中的内容创建一个新的文件系统映像[对应export]
info Display systen-wide information # 显示系统相关信息
inspect Return low-level infornation on a conta iner # 查看容器详细信息
ki11 Ki11 a running container # kill 指定 docker 容器
load Load an image from a tar archive # 从一个 tar 包中加载一个镜像[对应save]
login Register or Login to the docker registry server # 注册或者登录一个docker 源服务器
logout Log out from a Docker registry server # 从当前Docker registry 退出
logs Fetch the 1ogs of a container # 输出当前容器日志信息
port Lookup the public-facing port which is NAT-ed to PRIVATE PORT # 查看映射端0对应的容器内部源端
pause Pause a11 processes within a container # 暂停容器
ps List containers # 列出容器列表
pull Pu11 an image or a repository from the docker registry server # 从docker镜像源服务器拉取指定镜像或者库镜像
push Push an image or a repository to the docker registry server # 推送指定镜像或者库镜像至docker源服务器
restart Restart a running container # 重启运行的容器
rm Remove one or more containers # 移除一个或者多个容器
rmi Remove one or more images # 移除一个或多个镜像[无容器使用该镜像才可删除,否则需删除相关容器才可继续或-f强制删除]
run Run a command in a new container # 创建一个新的容器并运行一个命令
save Save an image to a tar archive # 保存一个镜像为一个tar包[对应load]
search Search for an image on the Docker Hub # 在dockerhub中搜索镜像
start Start a stopped containers # 启动容器
stop stop a running containers # 停止容器
tag Tag an image into a repository # 给源中镜像打标签
top Lookup the running processes of a container # 查看容器中运行的进程信息
unpause Unpause a paused conta iner # 取消暂停容器
version Show the docker version information # 查看docker版本号
wait Block until a container stops, then print its exit code # 截取容器停止时的退出状态值
docker的命令是十分多的,上面我们学习的那些都是最常用的容器和镜像的命令,之后我们还会学习很多!
作业练习
Docker 安装Nginx
# 1.搜索search 镜像,建议大家去docker搜索,可以看到帮助文档信息
root@ubuntu:/# docker search nginx
# 2.下载镜像 pull
root@ubuntu:/home# docker pull nginx
# 3.运行测试
root@ubuntu:/home# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 412b8cc72e4a 5 days ago 531MB
nginx latest 605c77e624dd 15 months ago 141MB
mysql 5.7 c20987f18b13 15 months ago 448MB
ubuntu latest ba6acccedd29 18 months ago 72.8MB
# -d 后台运行
# --name 给容器命名
# -p 宿主机端口,容器内部端口
root@ubuntu:/home# docker run -d --name nginx01 -p 3344:80 nginx
5a5c704ecd58f98814939217f17a8d6ba3d123894d31ffc3a25acc6dcaa00eb7
root@ubuntu:/home# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a5c704ecd58 nginx "/docker-entrypoint.…" 12 seconds ago Up 8 seconds 0.0.0.0:3344->80/tcp, :::3344->80/tcp nginx01
# 测试能不能curl通
root@ubuntu:/home# curl localhost:3344
# 进入容器
root@ubuntu:/home# docker exec -it nginx01 /bin/bash
root@5a5c704ecd58:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@5a5c704ecd58:/# cd /etc/nginx
root@5a5c704ecd58:/etc/nginx# ls
conf.d mime.types nginx.conf uwsgi_params
fastcgi_params modules scgi_params
端口暴露的概念
思考问题:我们每次改动nginx配置文件,都需要进入容器内部?十分的麻烦,我要是可以在容器外部提供一个映射路径,达到在容器外部修改文件名,容器内部就可以自动修改 ?有!那就是 -v 数据卷!
作业:docker来装一个tomcat
# 官方的使用
docker run -it --rm tomcat:9.0
# 我们之前的启动都是后台,停止了容器之后,容器还是可以查到 docker run -it --rm, 一般用来测试,用完就删除
# 下载再启动
docker pull tomcat
# 启动运行 3355暴露的是本机的端口 8080暴露的是容器的端口
root@ubuntu:~# docker run -d -p 3355:8080 --name tomcat01 tomcat
# 测试访问没有问题
# 进入容器
root@ubuntu:~# docker exec -it tomcat01 /bin/bash
# 发现问题: 1.linux命令少了,2.没有webapps 阿里云镜像的原因,默认是最小的镜像,所有不必要的都剔除掉。
#保证最小可运行的环境!
思考问题:我们以后要部署项目,如果每次都要进入容器是不是十分麻烦?我要是可以在容器外部提供一个映射路径 , webapps,我们在外部放置项目,就自动同步到内部就好了!
作业:部署ps + kibana
# es 暴露的端口很多!
# es 十分的耗内存
# es 的数据一般需要放置到安全目录!挂载
# --net somenetwork 网络配置
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
# 启动了linux就卡住了 docker stats 查看cpu的状态
# es是十分耗内存的,1.xG
# 查看docker stats
root@ubuntu:~# docker stats
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
e1fd50702278 elasticsearch 0.13% 1.242GiB / 3.799GiB 32.71% 3.51kB / 0B 1.67MB / 729kB 42
# 测试一下es是否成功了
root@ubuntu:~# curl localhost:9200
{
"name" : "e1fd50702278",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "s0HvUlN0Q7KjkaOGfXi76A",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
# 赶紧关闭,增加内存的限制
# 赶紧关闭,增加内存的限制,修改配置文件 -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
# 查看 docker stats
root@ubuntu:~# curl localhost:9200
{
"name" : "01ba5f0b02e2",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "gr41UQpiSjGyCNsmoIB8_w",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
作业:使用 kibana 连接 es ? 思考网络如何才能连接过去!
可视化
- portainer(先用这个)
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
- Rancher(CI/CD再用)
什么是portainer?
Docker图形化界面管理工具!提供一个后台面板供我们操作 !
docker run -d -p 8088:9000 \
--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试:http://ip(自己的ip地址):8080/
进入之后的面板
可视化面板我们平时不会使用,大家自己测试玩玩即可!