Docker常用命令
帮助命令
docker version #显示docker的版本信息
docker info #显示docker的详细信息,包括运行的容器,系统版本等
docker 命令 --help #显示docker命令的帮助文档
帮助文档的地址:
镜像命令
docker images 查看所有的本地主机的镜像
root@kali:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f6d0b4767a6c 7 weeks ago 133MB
root@kali:~#
#解释
REPOSITORY #仓库镜像的名称
TAG #仓库镜像的版本
IMAGE ID #仓库镜像的ID值
CREATED #仓库镜像的创建时间
SIZE #镜像的大小
#docker images命令可选项
Options:
-a, --all #显示所有的镜像,包括隐藏的镜像
-q, --quiet #只显示镜像的ID值
#常用命令
docker images -aq #显示所有镜像的ID值
docker search 搜索镜像远端仓库中的镜像
#搜索mysql镜像
#第一种方式,直接在命令行进行搜索
root@kali:~# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10589 [OK]
mariadb MariaDB Server is a high performing open sou… 3963
#可选项
Options:
-f, --filter filter #基于过滤提供结果
--limit int #限制查找的最大值,默认为25
#根据stars的个数过滤
root@kali:~# docker search mysql --filter=stars=3000
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10589 [OK]
mariadb MariaDB Server is a high performing open sou… 3963 [OK]
#第二种方式
通过web 进行搜索docker 仓库
网址:https://hub.docker.com/
docker pull 下载镜像
#下载mysql镜像文件,不加版本的话默认为最高版本
root@kali:~# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
#下载版本为mysql5.7的镜像
root@kali:~# docker pull mysql:5.7 指定版本要在docker仓库中存在
#可选项
Usage: docker pull [OPTIONS] NAME[:TAG|@DIGEST]
Options:
-a, --all-tags #下载仓库中的所有镜像
-q, --quiet Suppress verbose output
docker rmi 删除镜像
#删除单个镜像 通过镜像ID值进行删除
root@kali:~/桌面# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 a70d36bc331a 7 weeks ago 449MB
nginx latest f6d0b4767a6c 8
`删除ID值为a70d36bc331a的mysql镜像` #此命令不能够删除正在运行中的镜像
root@kali:~/桌面# docker rmi a70d36bc331a
Untagged: mysql:5.7
Untagged: mysql@sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Deleted: sha256:a70d36bc331a13d297f882d3d63137d24b804f29fa67158c40ad91d5050c39c5
#批量删除所有的镜像
docker rmi $(docker images -aq)
root@kali:~/桌面# docker rmi $(docker images -aq)
Untagged: nginx:latest
Untagged: nginx@sha256:10b8cc432d56da8b61b070f4c7d2543a9ed17c2b23010b43af434fd40e2ca4aa
Deleted: sha256:f6d0b4767a6c466c178bf718f99bea0d3742b26679081e52dbf8e0c7c4c42d74
#强制删除镜像 通过参数 -f 强制删除镜像文件,不管是否还在运行中
root@kali:~/桌面# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 a70d36bc331a 7 weeks ago 449MB
root@kali:~/桌面# docker rmi a70d36bc331a #删除失败
Error response from daemon: conflict: unable to delete a70d36bc331a (must be forced) - image is being used by stopped container d987d0d60e39
root@kali:~/桌面# docker rmi -f a70d36bc331a #通过-f参数删除成功
Untagged: mysql:5.7
Untagged: mysql@sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Deleted: sha256:a70d36bc331a13d297f882d3d63137d24b804f29fa67158c40ad91d5050c39c5
容器命令
ps:有了镜像才能够创建容器
新建容器并启动
docker run
Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#参数说明
--name="name" #给容器起个别名
-d #后台运行
-it #使用交互式运行,能够进行容器内部
-p #指定容器的端口
-P(大写) #随机指定一个端口
#-p 参数的四种指定方式
-p 容器内端口 #指定开启服务在容器内部的端口
-p 主机端口:容器内端口 #映射主机端口到容器内端口,访问主机的端口相当于访问容器内相对应的端口
容器端口 #和 加-p参数相同
-p 主机ip:主机端口:容器端口 #可以指定ip地址进行映射
#交互式启动容器
root@kali:~/桌面# docker run -it 300e315adb2f /bin/bash
[root@833590e29d22 /]# 此时已经进入到容器内部
#后台启动容器,并指定容器的名称
root@kali:~/桌面# docker run -d --name=centos1 centos
b59be429d062e5b7df44359e5b0b440fee6f1eb6a3c2e865bb0b8deefb12a0ca
root@kali:~/桌面# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b59be429d062 centos "/bin/bash" 18 seconds ago Exited (0) 16 seconds ago `centos1`
#列出所有运行中的容器
docker ps
Usage: docker ps [OPTIONS]
常用参数
-a
-q
-n=?
List containers
Options:
-a, --all #列出所有的容器,包括没有启动的
-f, --filter filter Filter output based on conditions provided
--format string #格式化输出
-n, --last int #显示n个最近创建的容器,默认为1
-l, --latest #显示最后一个创建的容器
--no-trunc Don't truncate output
-q, --quiet #只显示容器的ID值(默认显示运行中容器)
-s, --size Display total file sizes
#显示所有的容器
root@kali:~/桌面# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b59be429d062 centos "/bin/bash" 3 minutes ago Exited (0) 3 m
#显示所有容器的ID值
root@kali:~/桌面# docker ps -aq
b59be429d062
启动容器
当容器创建后,有的容器处于未被启动的状态,所以需要使用docker start 命令启动容器
docker start
Usage: docker start [OPTIONS] CONTAINER [CONTAINER...]
Options:
-a, --attach Attach STDOUT/STDERR and forward signals
--checkpoint string Restore from this checkpoint
--checkpoint-dir string Use a custom checkpoint storage directory
--detach-keys string Override the key sequence for detaching a container
-i, --interactive Attach container's STDIN
#用例
root@kali:~/桌面# docker start e5d2a8c59b11
e5d2a8c59b11
退出容器
exit #直接停止容器并退出
ctrl+q+p #容器不停止退出
停止容器
docker stop 容器ID
#通过该命令使正在运行中的容器停止
docker kill 容器ID
#强制删除容器
重启容器
docker restart 容器ID
删除容器
docker rm
Usage: docker rm [OPTIONS] CONTAINER [CONTAINER...]
Options:
-f, --force Force the removal of a running container (uses SIGKILL)
-l, --link Remove the specified link
-v, --volumes Remove anonymous volumes associated with the container
常用:
docker rm 容器ID
#根据ID值删除的单个容器,在删除容器前,如果容器是运行状态,需要先停止容器
root@kali:~/桌面# docker rm e5d2a8c59b11
e5d2a8c59b11
#删除所有的容器
docker rm $(docker ps -aq)
#强制删除容器 -f 参数
1.强制删除一个容器 docker rm -f 容器ID
2.强制删除所有的容器
docker rm -f $(docker ps -aq)
其他命令
后台启动容器
docke run -d centos
后台启动容器时,会发现系统没有启动起来,因为docker发现系统没有做任何事情,就默认关闭,所以需要有一个前台进程启动
查看日志
docker logs
Usage: docker logs [OPTIONS] CONTAINER
Fetch the logs of a container
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 -f -t --tail n 容器ID
输出容器的n条带有时间的日志
root@kali:~/桌面# docker logs -t -f --tail 10 047897c93173
2021-03-12T06:50:20.449684400Z [root@047897c93173 /]#
查看容器中的进程信息
docker top 容器ID
root@kali:~/桌面# docker top 047897c93173
UID PID PPID C STIME TTY TIME CMD
root 16393 16374 0 14:50 pts/0 00:00:00 /bin/bash
查看元数据
docker inspect
Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]
Return low-level information on Docker objects
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
常用命令:
`docker inspect 容器ID`
root@kali:~/桌面# docker inspect 047897c93173
[
{
"Id": "047897c93173aae3c8015ca9dc825f655701abd019c4f8249ad8fb3305af0bca",
"Created": "2021-03-12T06:50:16.00809096Z",
"Path": "/bin/bash",
进入当前正在运行的容器
#进入到容器中的两种方式1
docker exec -it 容器ID /bin/bash
root@kali:~/桌面# docker exec -it 047897c93173 /bin/bash
[root@047897c93173 /]#
#方式2
docker attach 容器ID
root@kali:~/桌面# docker attach 047897c93173
[root@047897c93173 /]# ls
#两种方式的区别
docker exec #进入容器后开启一个新的终端
docker attach #进入容器后正在执行的终端,不会启动新的进程
容器拷贝
将容器内的数据与容器外的数据进行拷贝
root@kali:~/桌面# docker cp --help
Usage: docker cp 容器ID:容器路径 主机路径 #常用
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH
Options:
-a, --archive Archive mode (copy all uid/gid information)
-L, --follow-link Always follow symbol link in SRC_PATH
容器数据卷
什么是容器数据卷
问题:当docker容器删除时,容器内的数据也会消失,那么对于mysql这种需要保存数据的容器来说,就很不友好,所以需要一种容器数据持久化的技术,这就是卷技术!其实就是目录挂载,将容器内部的目录挂载到本地linux系统中。
总结:容器的持久化和同步操作,容器之间也是可以数据共享的!
使用数据卷
方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
#挂载容器内部的home目录到本地的/home/test目录
docker run -it -v /home/test:/home centos /bin/bash
#在kali中使用docker inspect 容器ID 查看是否挂载成功
docker inspect 280dfe9cd845
此时已经成功绑定了本机与容器内容的文件目录,两者之间的数据会进行同步
2.停止容器后,在本机修改home/test目录下的文件,当再次启动容器时,文件修改也会同步到容器内
好处:对于数据的修改以后只需要在本地修改即可,不需要进去容器内部了
实战:安装MYSQL数据库
#1 查找mysql镜像
docker search mysql
#2 下载版本为5.7的mysql镜像
docker pull mysql:5.7
#3 启动镜像 mysql数据库需要配置数据库的密码才能够登陆 使用-e MYSQL_ROOT_PASSWORD=密码 进行设置,并挂载容器中的data目录以及conf目录
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name=mysql01 容器id
命令:
-d 后台运行
-p 映射端口
-v 挂载数据卷
-e 容器配置参数
--name 容器别名
注意:删除容器并不会使本地的数据丢失,这就实现了容器数据本地持久化
具名挂载以及匿名挂载
docker volume 查看容器数据卷相关命令
Usage: docker volume COMMAND
Commands:
create 创建一个卷
inspect 查看卷的具体信息
ls 列出所有的数据卷
prune 移除所有本地不使用的数据卷
rm 删除数据卷
#匿名挂载
在挂载数据卷时只指定了容器内的地址,就是匿名挂载
-v 容器内路径
docker run -d -v /etc/nginx --name nginx1 nginx
#仅指定了容器内部的地址,那么怎么查看卷的位置呢,就要使用docker volume list 命令。这种没有具体的名称的就是匿名挂载
local 1b3c7649f029061611b5aa13e26c74b3d0b85c210ed37ca8ff4d32c9c3d0f9aa
#具名挂载
-v 名称:容器路径
使用以上命令为数据卷制定一个数据卷名称
docker run -d -v haha:/etc/nginx --name=nginx1 nginx
#haha就是数据卷名,使用docker volume list 命查看,这种有具体的用户名的就是具名挂载
挂载的三种形式总结
-v 容器路径 #匿名挂载
-v 卷名:容器路径 #具名挂载
-v 主机路径:容器路径 #指定路径挂载
#还可以使用一下形式对容器内部的挂载进行文件权限设置,以指定路径为例,说明:权限是对于容器内部而言的!
-v 主机路径:容器路径:ro #指定容器内部只能进行读取
ro #指定容器内部只能进行读取
rw #容器可读可写
初始DockerFile
DockerFile就是构建docker镜像的构建文件,就是命令脚本,dockerfile的每一步都是一层。
新建一个docker镜像
docker build
docker build --help
Options:
--add-host list Add a custom host-to-IP mapping (host:ip)
--build-arg list Set build-time variables
--cache-from strings Images to consider as cache sources
--cgroup-parent string Optional parent cgroup for the container
--compress Compress the build context using gzip
--cpu-period int Limit the CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit the CPU CFS (Completely Fair Scheduler) quota
-c, --cpu-shares int CPU shares (relative weight)
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--disable-content-trust Skip image verification (default true)
-f, --file string Name of the Dockerfile (Default is 'PATH/Dockerfile')
--force-rm Always remove intermediate containers
--iidfile string Write the image ID to the file
--isolation string Container isolation technology
--label list Set metadata for an image
-m, --memory bytes Memory limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable
unlimited swap
--network string Set the networking mode for the RUN instructions during
build (default "default")
--no-cache Do not use cache when building the image
-o, --output stringArray Output destination (format: type=local,dest=path)
--platform string Set platform if server is multi-platform capable
--progress string Set type of progress output (auto, plain, tty). Use
plain to show container output (default "auto")
--pull Always attempt to pull a newer version of the image
-q, --quiet Suppress the build output and print image ID on success
--rm Remove intermediate containers after a successful build
(default true)
--secret stringArray Secret file to expose to the build (only if BuildKit
enabled): id=mysecret,src=/local/secret
--security-opt strings Security options
--shm-size bytes Size of /dev/shm
--squash Squash newly built layers into a single new layer
--ssh stringArray SSH agent socket or keys to expose to the build (only
if BuildKit enabled) (format:
default|<id>[=<socket>|<key>[,<key>]])
--stream Stream attaches to server to negotiate build context
-t, --tag list Name and optionally a tag in the 'name:tag' format
--target string Set the target build stage to build.
--ulimit ulimit Ulimit options (default [])
常用命令:
-t 镜像名称
-f dockerfile的路径
使用:
docker build -f dockerfile -t zhang/centos:1.0 . #注意后面有个点
root@kali:~/桌面/dockertouch# docker build -f dockerfile -t zhang/centos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["Volume01","Volume02"]
---> Running in 311bc5cbd625
Removing intermediate container 311bc5cbd625
---> fb0668384f2f
Step 3/4 : CMD echo "---end---"
---> Running in 96e0f9f7ec1d
Removing intermediate container 96e0f9f7ec1d
---> 1e782377e963
Step 4/4 : CMD /bin/bash
---> Running in ae757d48572d
Removing intermediate container ae757d48572d
---> 1128a7570504
Successfully built 1128a7570504
Successfully tagged zhang/centos:1.0
root@kali:~/桌面/dockertouch#
#一个简单的dockerfile文件
FROM centos
VOLUME ["Volume01","Volume02"]
CMD echo "---end---"
CMD /bin/bash
在dockerfile中我们在第二步构建了两个数据卷,当容器启动时,docker会自动匿名挂载两个数据卷在本地,通过图片也发现已经成功挂载,这是挂载数据卷的第二种方法
数据卷容器
两个或多个容器之间实现数据共享 --volume-from 参数实现数据共享
实验设计
1.两个容器之间数据互联
2.三个容器之间数据互联
3.删除容器
实验一:两个容器之间数据互联
#开启第一个容器
docker run -it --name docker01 1128a7570504 /bin/bash
#开启第二个容器 并设置卷共享来自docker01
docker run -it --name docker02 --volumes-from docker01 1128a7570504 /bin/bash
#进入docker01 中创建一个新的文件,查看docker02是否自动同步
docker attach e6a9ca916e67
touch dockero1
[root@e6a9ca916e67 Volume01]# ls
dockero1
#进入docker02,查看docker02中是否有对应的文件
发现docker01文件已经成功同步过去
实验二:三个容器互连数据
#重新开启一个容器,并挂载docker01的数据卷
docker run -it --name docker03 --volumes-from=docker01 1128a7570504 /bin/bash
#查看docker03中是否同步了docker01文件
三个容器都存活
发现docker03中也同步了docker01文件
证明了数据卷之间的共享的可能性
那么删除docker01,docker02以及docker03的文件也会消失吗?
答案是不会的,看实验三
实验三:删除docker01,验证文件的存在
删除容器docker01,docker02中的数据仍然存在,但是当所有相关的容器都删除时,数据也想对应的删除了
结论:容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有人使用为止!
DockerFile
构建步骤:
1.编写一个dockerfile文件
2.docker build构建成为一个镜像
3.docker run 运行镜像
4.docker push 发布镜像
基础知识:
1.每个保留关键字(指令)都必须是大写字母
2.执行由上到下顺序执行
3.#代表注释
4.每一个指定都会创建提交一个新的镜像层。
dockerfile 指令
FROM #基础镜像 一切都从这里开始构建
MAINTAINER #镜像是谁写的,姓名+邮箱
RUN #镜像构建时需要运行的命令
ADD #步骤,比如说需要添加tomcat,那么就要把tomcat压缩包给添加到系统中
WORKDIR #镜像的工作目录
VOLUME #设置容器卷,挂载到那个位置
EXPOSE #暴露端口配置
CMD #指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT #指定容器启动时要运行的命令,可以追加命令
ONBUILD #当构建一个被继承dockerfile时,会运行onbuilld,触发指令
copy #类似add,将文件拷贝到镜像中
ENV # 构建时设置环境变量
实战centos
创建一个自己的centos
FROM centos #基于centos镜像进行构建
VOLUME ["Volume01","Volume02"] #设置数据卷
MAINTAINER huahai@hillstone.com #设置作者
ENV MYPATH /usr/local #设置环境变量
WORKDIR $MYPATH #设置工作目录
RUN yum -y install vim #安装软件
RUN yum -y install net-tools
EXPOSE 80 #暴露端口
CMD echo $MYPATH #执行一些命令
CMD echo "---end---"
CMD /bin/bash
#通过docker build构造镜像
docker build -f dockerfile -t mycentos:0.1 .
docker history
使用該命令查看构建dockerfile时使用的命令
docker history 镜像ID
CMD和ENTERPOINT的区别
CMD使用
#编写dockerfile输出ls -a 命令
FROM centos
CMD ["ls","-a"]
#编译并进入到容器中
docker build -f mydocker -t mydocker:0.1 .
root@kali:~/桌面/dockertouch# docker run -it b81704c83ed6
. .dockerenv dev home lib64 media opt root sbin sys usr
.. bin etc lib lost+found mnt proc run srv tmp var
上面容器启动时cmd命令直接输出了列表,但是如果我们想追加-l命令显示更详细的列表时,使用docker run -it b81704c83ed6 -l 添加-l命令是行不通的,下面看测试
root@kali:~/桌面/dockertouch# docker run -it 4f08d53eb1c5 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
ERRO[0001] error waiting for container: context canceled
发现报错了,`cmd不支持追加参数的形式,必须在命令中输入完整的命令`,如下:
root@kali:~/桌面/dockertouch# docker run -it 4f08d53eb1c5 ls -al
total 56
drwxr-xr-x 1 root root 4096 Mar 12 09:53 .
drwxr-xr-x 1 root root 4096 Mar 12 09:53 ..
ENTERPOINT使用
#编写一下脚本进行测试
FROM centos
ENTRYPOINT ["ls","-a"]
#docker build创建镜像
docker build -f mydocker -t myfile:1.0 .
#执行镜像,发现自动列出目录
root@kali:~/桌面/dockertouch# docker run -it bc1f228ae70e
. .dockerenv dev home lib64 media opt root sbin sys usr
.. bin etc lib lost+found mnt proc run srv tmp var
#添加-l参数
root@kali:~/桌面/dockertouch# docker run -it bc1f228ae70e -l
total 56
drwxr-xr-x 1 root root 4096 Mar 12 10:03 .
drwxr-xr-x 1 root root 4096 Mar 12 10:03 ..
-rwxr-xr-x 1 root root 0 Mar 12 10:03 .dockerenv
lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x 5 root root 360 Mar 12 10:03 dev
drwxr-xr-x 1 root root 4096 Mar 12 10:03 etc
可以直接添加-l参数, 说明ENTRYPOINT 可以在启动容器时直接拼接命令
Comments | NOTHING