docker基础命令
Posted 遙遙背影暖暖流星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker基础命令相关的知识,希望对你有一定的参考价值。
一、docker命令-镜像
1、查看docker版本
docker -v
docker version
decker info #可以查看所有运行容器的镜像数量,运行容器的版本,可以分配的CPU,总的内存等信息.docker的工作目录 /var/lib/decker
[root@ct ~]# docker version
Client: Docker Engine - Community
Version: 20.10.8 #版本
API version: 1.41 #api版本
Go version: go1.16.6 #go语言版本
Git commit: 3967b7d
Built: Fri Jul 30 19:55:49 2021
OS/Arch: linux/amd64
Context: default #映射默认
Experimental: true #实验功能开启
Server: Docker Engine - Community
Engine:
Version: 20.10.8
API version: 1.41 (minimum version 1.12)
Go version: go1.16.6
Git commit: 75249d8 #暂存区里的改动给提交到本地的版本库的id
Built: Fri Jul 30 19:54:13 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.4.9
GitCommit: e25210fe30a0a703442421b0f60afac609f950a3
runc:
Version: 1.0.1
GitCommit: v1.0.1-0-g4144b63
docker-init:
Version: 0.19.0
GitCommit: de40ad0
[root@ct ~]#
2、搜索镜像
docker search nginx
——》自己制作镜像,然后上传到docker hub 上
优化:有效减少镜像大小,dockerfile 优化方向
也可以直接上官网:
https://hub.docker.com/ 》搜nginx》第一个官方分布》tag》找到目的版本的编号
然后抓取下载docker pull nginx:1.21.0
3 、下载镜像
默认是从docker hub
docker pull 镜像名称
例如:docker pull nginx #不交标签则默认latest,最新版本
4、查看镜像列表
docker images #查看当前docker下的下载镜像信息
[root@ct ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
#镜像仓库 #标签 #镜像id #建立时间 #大小
redis 6.2-alpine3.14 f6f2296798e9 3 days ago 32.3MB
redis v1 f6f2296798e9 3 days ago 32.3MB
busybox latest 42b97d3c2ae9 10 days ago 1.24MB
nginx 1.21 dd34e67e3371 13 days ago 133MB #
nginx v1 dd34e67e3371 13 days ago 133MB
#根据image id,发现与上面的其实是同个镜像,只是标签不同
hello-world latest d1165f221234 5 months ago 13.3kB
centos 7 8652b9f0cb4c 9 months ago 204MB
[root@ct ~]# docker images redis:v1 #单独看一个镜像,REPOSITORY+TAG为一个镜像(唯一性),而tag可以人为指定的
REPOSITORY TAG IMAGE ID CREATED SIZE
redis v1 f6f2296798e9 3 days ago 32.3MB
5 获取镜像信息
docker inspect 镜像ID (或者镜像:标签)
docker inspect redis:
[root@ct ~]# docker inspect nginx:1.21
[
{
"Id": "sha256:dd34e67e3371dc2d1328790c3157ee42dfcae74afffd86b297459ed87a98c0fb",
"RepoTags": [
"nginx:1.21",
"nginx:v1"
],
"RepoDigests": [
"nginx@sha256:4d4d96ac750af48c6a551d757c1cbfc071692309b491b70b2b8976e102dd3fef"
],
"Parent": "",
....................
[root@ct ~]# docker inspect dd34e67e3371
[
{
"Id": "sha256:dd34e67e3371dc2d1328790c3157ee42dfcae74afffd86b297459ed87a98c0fb",
"RepoTags": [
"nginx:1.21", #镜像的其他名有两个
"nginx:v1" #另一个镜像名
],
"RepoDigests": [
"nginx@sha256:4d4d96ac750af48c6a551d757c1cbfc071692309b491b70b2b8976e102dd3fef"
],
"Parent": "",
"Comment": "",
"Created": "2021-08-17T11:46:11.370722453Z",
"Container": "c8f4640bdac21c018ff68bfb015ab66f87de0ed066b73eb6607a832a8abf3581",
"ContainerConfig": {
"Hostname": "c8f4640bdac2",
6 、添加镜像标签
docker tag 软件名:旧标签 软件名:新标签
[root@ct ~]# docker tag nginx:1.21 nginx:lnmp
[root@ct ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 6.2-alpine3.14 f6f2296798e9 3 days ago 32.3MB
redis v1 f6f2296798e9 3 days ago 32.3MB
busybox latest 42b97d3c2ae9 10 days ago 1.24MB
nginx 1.21 dd34e67e3371 13 days ago 133MB
nginx lnmp dd34e67e3371 13 days ago 133MB
#旧的镜像不会消失,新改的镜像名虽然不同,但id不变
nginx v1 dd34e67e3371 13 days ago 133MB
hello-world latest d1165f221234 5 months ago 13.3kB
centos 7 8652b9f0cb4c 9 months ago 204MB
7、 删除镜像
docker rmi 镜像:标签
docker rmi `docker images -q` #-q 列出镜像ID,批量删
docker rmi -f 镜像:标签 #强制删除
8、镜像导出和导入
docker save -o 文件名 镜像名 #导出生成文件
docker load < 文件名 #重新导入镜像
docker save -o centos-7 centos:7 #导出生成文件centos-7
docker load <centos-7 #导出文件centos-7
[root@ct ~]# cd /opt/
[root@ct opt]# ls
containerd mysql-5.7.20 mysql-boost-5.7.20.tar.gz
[root@ct opt]# docker save -o centos-7 centos:7 #生成镜像文件
[root@ct opt]# ls
centos-7 containerd mysql-5.7.20 mysql-boost-5.7.20.tar.gz
[root@ct opt]# docker rmi -f centos:7 #删除原有镜像
Untagged: centos:7
Untagged: centos@sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e
Deleted: sha256:8652b9f0cb4c0599575e5a003f5906876e10c1ceb2ab9fe1786712dac14a50cf
[root@ct opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 6.2-alpine3.14 f6f2296798e9 3 days ago 32.3MB
busybox latest 42b97d3c2ae9 10 days ago 1.24MB
nginx 1.21 dd34e67e3371 13 days ago 133MB
nginx lnmp dd34e67e3371 13 days ago 133MB
hello-world latest d1165f221234 5 months ago 13.3kB
#没有centos这个镜像了
[root@ct opt]# docker load<centos-7
Loaded image: centos:7
[root@ct opt]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 6.2-alpine3.14 f6f2296798e9 3 days ago 32.3MB
busybox latest 42b97d3c2ae9 10 days ago 1.24MB
nginx 1.21 dd34e67e3371 13 days ago 133MB
nginx lnmp dd34e67e3371 13 days ago 133MB
hello-world latest d1165f221234 5 months ago 13.3kB
centos 7 8652b9f0cb4c 9 months ago 204MB
#重新生成
二、docker命令—容器操作
1、 查询容器
docker ps -a #显示主机上的容器及其状态
docker ps -aq #显示容器的ip
[root@ct ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57f77cf81738 centos:7 "/bin/bash" 30 hours ago Exited (137) 25 hours ago mystifying_buck
1ce04b9f9cad f6f2296798e9 "docker-entrypoint.s…" 2 days ago Up 2 days 6379/tcp nervous_dirac
914b1af0ecb0 redis:6.2-alpine3.14 "docker-entrypoint.s…" 2 days ago Up 2 days 6379/tcp raide1
886cd3d8c81e nginx:1.21 "/docker-entrypoint.…" 2 days ago Up 2 days 80/tcp socker1
CONTAINER ID:容器ID
IMAGE:镜像版本
CRATED:创建的时间
STATUS:运行的时间
PORTS:暴露的端口
NAMES:名称(可定义)
2、创建容器
docker create -itd nginx:latest /bin/bash
-i 让容器的标准输入保持打开
-t 分配一个伪终端
-d 后台守护进程的方式运行
3、 启动容器
docker start 容器id
docker run centos:7 /usr/bin/bash -c ls /
启动容器(一次性执行)
docker run -itd centos:7 /bin/bash/
#在后台持续进行
4、停止容器
docker stop 容器ID
#状态码0:正常退出,非0值表示非正常退出,137表示主动停止退出
[root@ct ~]# docker stop 57f77cf81738
57f77cf81738
5 、容器持续后台运行
[root@ct ~]# docker run -d centos:7 /usr/bin/bash -c "while true;do echo hello;done"
418050aa42b7e7c182eb484cb9b80519c708c0638d65c9add6ebfc016ce00633
[root@docker ~]# watch -n 2 docker ps -a #每两秒执行
[root@docker ~]# docker rm `docker ps -aq` #不会删除正在运行的
6 、进入容器
使用run
docker run -it nginx:latest /bin/bash #一次性的,退出则关闭
exec(容器必须为开启状态)
docker exec -it 容器ID /bin/bash
PS:
docker run -it 会创建前台进程,但是会在输入exit后终止进程。
docker attach 会通过连接stdin,连接到容器内输入输出流,会在输入exit后终止进程.
docker exec -it 会连接到容器,可以像SSH一样进入容器内部,进行操作,可以通过exit退出容器,不影响容器运行。
[root@ct ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e86cc40e5351 centos:7 "/bin/bash" 3 seconds ago Up 2 seconds great_golick
1ce04b9f9cad f6f2296798e9 "docker-entrypoint.s…" 2 days ago Up 2 days 6379/tcp nervous_dirac
914b1af0ecb0 redis:6.2-alpine3.14 "docker-entrypoint.s…" 2 days ago Up 2 days 6379/tcp raide1
886cd3d8c81e nginx:1.21 "/docker-entrypoint.…" 2 days ago Up 2 days 80/tcp socker1
[root@ct ~]# docker exec -it e86cc40e5351 /bin/bash
[root@e86cc40e5351 /]# ls #centos的容器中也有虚拟文件
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@e86cc40e5351 /]# exit #退出
exit
7、 容器导出与导入
docker export 容器ID > 文件名 #导出
docker import 导出的文件名(容器) 指定镜像名称 #导入容器文件,重新生成镜像
[root@ct ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e86cc40e5351 centos:7 "/bin/bash" 5 minutes ago Up 5 minutes great_golick
1ce04b9f9cad f6f2296798e9 "docker-entrypoint.s…" 2 days ago Up 2 days 6379/tcp nervous_dirac
914b1af0ecb0 redis:6.2-alpine3.14 "docker-entrypoint.s…" 2 days ago Up 2 days 6379/tcp raide1
886cd3d8c81e nginx:1.21 "/docker-entrypoint.…" 2 days ago Up 2 days 80/tcp socker1
[root@ct ~]# cd /opt/
[root@ct opt]# docker export 886cd3d8c81e > nginx-1.21 #生成文件
[root@ct opt]# ls
nginx-1.21
[root@ct opt]# docker stop 886cd3d8c81e #停止容器并删除容器
886cd3d8c81e
[root@ct opt]# docker rm 886cd3d8c81e
886cd3d8c81e
[root@ct opt]# docker rmi nginx:1.21 #删除镜像
Untagged: nginx:1.21
Deleted: sha256:0b4bf752f838f3b775546fd465d4afa64dd04ccb9e6ebca10ada8a10aeefef42
Deleted: sha256:109b539aca08b0ca21c16a38493491ee223a75e2b9738ac7145150155eec36db
[root@ct opt]# docker import nginx-1.21 nginx:1.21 #重新注入
sha256:0b4bf752f838f3b775546fd465d4afa64dd04ccb9e6ebca10ada8a10aeefef42
[root@ct opt]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e86cc40e5351 centos:7 "/bin/bash" 8 minutes ago Up 8 minutes great_golick
1ce04b9f9cad f6f2296798e9 "docker-entrypoint.s…" 2 days ago Up 2 days 6379/tcp nervous_dirac
914b1af0ecb0 redis:6.2-alpine3.14 "docker-entrypoint.s…" 2 days ago Up 2 days 6379/tcp raide1
[root@ct opt]# docker images #镜像重新出现
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.21 8345d48257de 4 seconds ago 132MB
redis 6.2-alpine3.14 f6f2296798e9 4 days ago 32.3MB
busybox latest 42b97d3c2ae9 11 days ago 1.24MB
nginx lnmp dd34e67e3371 2 weeks ago 133MB
8、删除容器
docker rm 容器ID
docker rm -f 容器ID #强制删除
docker ps -a | awk '{print "docker rm "$1}' | bash
#批量删除容器
docker rm `docker ps -aq`
#批量删除不在运行的容器,-f则强势删除所有
for i in 'docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i; done
#批量删除"exit"状态的容器
二、docker的网络模式
1、 host模式
容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
2 container:
创建的容器不会创建自己的网卡、设置IP等,而是和一个指定的容器共享IP、端口范围
这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿主机共享,新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定地容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表还是隔离的。两个容器的进程可以通过loo网卡设备通信
3、 None模式
该模式关闭了容器的网络功能
这种网络模式下容器只有lo回环网口,没有其他的网卡。none模式可以在容器创建时通过-network=none参数指定
这种类型的网络无法联网,但是封闭的网络能很好的保证容器的安全性
4 、Bridge模式
此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker虚拟网桥,通过docker 0 网桥及iptables的nat,表配置与宿主机通信
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0 的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair 设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为etho(容器的网卡),另一端放在主机中,以vethxxx,这样类似的名字命名,并将这个网络设备加入到docker0 网桥中。可以通过brctl show命令查看。
bridge模式是docker 的默认网络模式,不写-net参数,就是 bridge模式。使用docker run -p时, docker实际是在iptables,做了DNAT规则,实现端口转发功能。可以使用jptables. -t nat -vnL查看。
以上是关于docker基础命令的主要内容,如果未能解决你的问题,请参考以下文章