docker第一篇:docker概念及基础命令

安装完docker后,在命令行执行docker version可看docker版本,docker info可以查看更多信息。编辑/etc/docker/daemon.json文件,指定镜像源为腾讯,内容是

{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}

之后,systemctl restart docker,然后执行docker info看是否生效。

一、镜像相关命令

拉取镜像:

docker pull nginx

查看本地镜像:

docker images

从docker hub搜索镜像:

docker search xxx

删除本地镜像:

docker rmi nginx:latest

或者docker rmi image_id

查看某个镜像的内容

docker inspect image_id

构建镜像:

docker build -t repository[:tag] -f path1/Dockerfile path2

-t 指定镜像名称,格式是repository[:tag]。

-f 指定Dockerfile路径,可以省略,默认是上下文目录中的Dockerfile文件。是上下文目录,不是执行docker build命令的当前目录。

如docker build -t openresty:v1 .,表示上下文是当前目录,且以当前目录中的Dockerfile构建,repository是openresty,tag是v1。

除了自己build之外,也可以根据容器创建镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

假设现在有一个kafka容器正在运行,这个容器是我们根据bitnami/kafka:3.4镜像启动的,启动后我们安装了telnet命令,那么我们就可以执行docker commit  -m 'created by kafka container' kafka kafka:v0.0.1,来创建一个预装了telnet命令的kafka镜像。

查看本地某镜像的前世今生:

docker history image_id/repository[:tag]

如docker history redis:latest

保存镜像:

docker save -o XXX.tar repository:tag

如docker save -o openresty.tar openresty/openresty:latest

什么时候保存镜像呢?在A机器上build了一个镜像,是在nginx镜像上做的,自己装了一些常用的基础组件,如vim、procps、lsof、curl、net-tools、iputils-ping、telnet,这样在新镜像的容器中就可以用vi、ps、lsof、curl、ping、telnet等命令了。很多pull下来的镜像是不预装这些基础组件的,导致这些常用命令用不了,需要自己安装。想要在B机器上用这个我们预装好的镜像启动一个容器,则需要在A机器上保存此镜像,下载,然后上传到B机器上,在B机器上安装docker,然后载入此镜像,再启动容器即可。注意,如果保存时是用image_id指定的镜像,那么在载入时repository、tag会为none,所以最好用repository:tag指定要保存的镜像。可以一次save多个镜像。

载入镜像:

docker load -i XXX.tar

之后,可以用docker images命令查看是否载入成功,载入成功的话,就可以正常使用了。

给镜像打tag或者修改镜像tag

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

如docker tag kafka:v0.0.1 koushr/kafka:v0.0.2,就可以把kafka:v0.0.1镜像重新打tag为koushr/kafka:v0.0.2。

二、容器相关命令

1、启动容器:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

docker run -p 10000:80 nginx

-p 10000:80 表示把宿主机的10000端口和容器的80端口映射起来。多个映射需要用多个-p 指定,如-p 10000:80 -p 11000:11000。

nginx是repository名,tag省略的话,就是latest,上面命令等同于docker run -p 10000:80 nginx:latest。注意,此时是前台启动,执行ctrl+c后,容器就挂掉了。

-d 表示后台启动,如docker run -d -p 11000:80 nginx

--restart,指定容器退出时的重启策略,可选值有no、on-failure、always,默认值时no。

--name:指定容器的名字。强烈建议在启动容器时给容器指定一个名字。如docker run -d -p 11000:80 --name nginx_v1 nginx

--network:指定网络模式,可选值有bridge(桥接模式,默认值)、host、none。

-e 指定环境变量,多个环境变量需要用多个-e 指定,如-e port=10000 -e env=prd。容器启动后,就可以通过echo $port查看了。在我们的应用程序中,就可以用这个环境变量。在Dockerfile中的CMD命令中,也可以通过$port获取port值,进而使用,如启动应用时指定端口,或者设值到配置文件中。

-v:给宿主机某目录和容器某目录创建映射。后面跟宿主机某目录:容器某目录,改变任一目录的文件,对应目录也会改变。如docker run -d -p 11000:80 -v /Users/shengruikou/nginx/html:/usr/share/nginx/html nginx,用宿主机的/Users/shengruikou/nginx/html目录映射容器的/usr/share/nginx/html目录,在宿主机的这个目录中新建一个index.html文件,写点东西,会发现在容器对应的目录中同样会出现一个index.html文件,内容和宿主机的一样。反向操作,结果也是一样。如果宿主机是windows,那么路径要用双反斜线表示,如-v D:\\nginx\\html:/usr/share/nginx/html。

--cpus:分配cpu核数

-m:分配内存大小

docker run -d -v /root/shengruikou/app:/app -e BASICINFOPORT=8885 --network host --cpus 1 -m 2g openjdk8_env:latest

docker run还可以指定容器启动后执行的命令,如

docker run -d -v /root/shengruikou/app:/app -e BASICINFOPORT=8885 --network host openjdk8_env:latest bash touch.a.txt

如果要执行的命令太多的话,也可以都写到一个sh文件中,然后docker run指定这个文件,如

docker run -d -v /root/shengruikou/app:/app -e BASICINFOPORT=8885 --network host openjdk8_env:latest bash /path/cmd.sh

注意,bash后面的路径是容器中的路径,不是宿主机中的路径。

如果在容器内要访问宿主机的其他服务,则用host.docker.internal指代宿主机的ip即可。特别地,在linux环境,在docker run时需要加--add-host=host.docker.internal:host-gateway,否则容器识别不了host.docker.internal,而在mac、windows环境则不需要。

2、查看容器:

docker ps

默认只显示运行中的容器,如果想查看包括挂掉的所有容器,则需要使用-a选项。

加-q选项,则只展示容器id。

如果COMMAND显示不全的话可以再加个--no-trunc选项,即docker ps -a --no-trunc,此时container_id也会显示全。

3、查看容器日志

docker logs [OPTIONS] CONTAINER

docker logs container_id:会从头打印日志

docker logs -f container_id:会从头打印日志并tail最新日志

docker logs -f -n 10 container_id:会打印最后10行日志并tail最新日志

docker logs -t container_id:会额外在每行的最左边打印出时间戳,时间戳型如2023-05-06T05:44:52.570383069Z,精确到纳秒,和实际时间看起来有8小时的时间差

docker logs -t --since xxx --until yyy container_id:打印指定时间范围内的日志,--since、--until跟的值的格式要和时间戳格式一样

4、查看容器的创建时间(Created)、启动时间(StartedAt)、目录映射(Mounts)、环境变量、在宿主机的目录、重启次数、重启策略、限制的cpu/内存等信息

docker inspect container_id

5、暂停容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]

停掉所有的容器:docker stop $(docker ps -aq)

6、启动/重启容器

docker start contain_id

docker restart container_id

7、删除容器

docker rm container_id

删掉某running状态的容器:docker rm -f container_id。

删掉所有的容器:docker rm $(docker ps -aq),如果有容器处于running状态,则这些不会删除。加-f选项,会强制删掉所有容器。

删掉所有停掉的容器:docker container prune

8、进入容器

先docker ps 查看容器id,假如是775c7c9ee1e1,则继续执行 docker exec -it 775c7c9ee1e1 bash。如果报错,则尝试把bash换成sh,因为不同的linux系统命令是不一样的。还可以用-u指定用户,如docker exec -it -u root 775c7c9ee1e1 bash。

cat /etc/os-release可以显示出当前系统具体是哪个linux系统,已知的linux系统有Alpine、CentOS、Debian、Fedora:

在Alpine安装软件用apk。查看源:cat /etc/apk/repositories,看到源的域名是dl-cdn.alpinelinux.org,dns解析出来的ip是国外的,我们可以替换成国内源,sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories,再执行apk update,之后就可以安装软件了,如apk add vim procps mandoc lsof netcat-openbsd

在CentOS上安装软件用yum,如yum install -y vim

在Ubuntu、Debian上安装软件用apt-get。同Alpine类似,查看源:cat /etc/apt/sources.list,看到源的域名是deb.debian.org,我们可以替换成国内源,sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list,再执行apt-get update,之后就可以安装软件了,如apt-get install -y vim iputils-ping。

在Fedora安装软件用microdnf ,如microdnf install -y lsof

9、更新运行中的容器

docker update --help

如docker update --cpus 1 -m 1G --memory-swap -1 --restart=always container_id

10、查看容器使用的cpu、内存情况

docker stats [OPTIONS] [CONTAINER...]

如docker stats | grep -E -i 'name|kafka'

11、在宿主机和容器间拷贝文件

docker cp

如把宿主机的/path1/a.txt文件拷贝到容器a的/path2目录:docker cp /path1/a.txt a:/path2

如把容器a的/path1/a.txt文件拷贝到宿主机的/path2目录:docker cp a:/path1/a.txt /path2

如果因为配置文件修改错误导致容器起不来,容器进不去,那么可以用docker cp命令把配置文件拷贝出来修改,然后再拷贝进去,直到容器能启动。

12、查看容器启动后有哪些文件、目录有修改

docker diff container_id

13、查看docker容器的启停事件

docker events

14、把容器导出成一个镜像:

docker export -o xxx.tar container_id

15、导入镜像:

docker import file repository[:tag]

docker run导入的镜像时,必须在最后面指定command,否则会报"No command specified"。command是用docker ps命令看到的原来的容器的COMMAND值。

16、给容器重命名

docker rename CONTAINER NEW_NAME

17、容器内访问宿主机的其他服务

在windows、mac系统上,用host.docker.internal表示宿主机ip。在linux系统上,要想让host.docker.internal生效,还得在容器启动时指定host,即docker run --add-host=host.docker.internal:host-gateway。

 

容器技术有很多具体的实现,docker是最初也是最流行的容器技术,它的主要形态是运行在linux上的docker engine。我们使用的各种dcoker命令,必须与后端服务docker daemon通信才能实现各种功能。

posted on 2020-05-19 21:06  koushr  阅读(411)  评论(0编辑  收藏  举报

导航