docker容器基础使用与技巧
Contents
拉取镜像与创建容器
docker pull 拉取镜像
我们可以用docker images
来查看系统已经获取过的镜像。
user@yourpc:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 90d5884b1ee0 5 days ago 188 MB
php 5.6 f40e9e0f10c8 9 days ago 444.8 MB
nginx latest 6f8d099c3adc 12 days ago 182.7 MB
mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB
ubuntu 15.10 4e3b13c8a266 4 weeks ago 136.3 MB
hello-world latest 690ed74de00f 6 months ago 960 B
表中意义分别是:
- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
如果我们想拉取镜像站中的一个新镜像,那就运行docker pull
命令
docker pull ubuntu:20.04
ubuntu是镜像名,20.04是镜像tag,不填的话就是默认:latest。
成功后再运行docker images
就能发现多了一条
user@yourpc:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 20.04 d5ca7a445605 2 years ago 65.6MB
在pull一个远端镜像前,也可以提前查一下有哪些相关镜像,执行
user@yourpc:~$ docker search httpd
NAME DESCRIPTION STARS OFFICIAL
httpd The Apache HTTP Server Project 4688 [OK]
clearlinux/httpd httpd HyperText Transfer Protocol (HTTP) ser… 5
paketobuildpacks/httpd 0
vulhub/httpd 0
jitesoft/httpd Apache httpd on Alpine linux. 0
openquantumsafe/httpd Demo of post-quantum cryptography in Apache … 12
wodby/httpd 0
dockette/httpdump 0
betterweb/httpd 0
在这里我们可以看见有关的镜像名字、简单描述,以及是否是官方镜像。
创建并运行容器
交互式运行容器
最简单的创建并运行的容器的命令:
docker run -it ubuntu /bin/bash
- run 是创建并运行容器的命令选项;
- -i 指interactive,以交互的形式运行容器;
- -t 指terminal, 以终端的形式运行容器;-it是常用组合
- ubuntu指使用Ubuntu镜像创建容器;
- /bin/bash 放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。
想要退出交互环境,输入exit
就可以退出了。
查看运行中的容器/查看所有存在的容器(无论是否运行)使用下列命令:
docker ps #查看运行中的容器
docker ps -a #查看所有容器
容器的启动停止等管理和systemd类似:
docker start 容器id/name #开启容器
docker stop 容器id/name #停止容器
docker restart 容器id/name #重启容器
后台运行容器
当我们希望容器表现的像个服务,安静的在后台运行时,可以通过参数 -d 指定
docker run -itd --name ubuntu.1 ubuntu /bin/bash
- -d 指定容易运行在后台;
- –name 赋予容器名字,可以更方便的管理
想要查看运行中的容器其中的进程,可以用docker top 容器id/name
命令。
进入一个容器
运行在后台的容器,我们也经常会有调试设置的时候,这时候就需要我们能够进入容器触及里面的文件,推荐使用 docker exec
命令,因为exec退出后容器会继续运行,像是一种热交互。
docker exec -it ubuntu.1 /bin/bash
- -it 仍然指交互式终端运行;
- ubuntu.1 是要进入的容器名字,换成id也可;
- /bin/bash 进入容器要执行的命令;
这样我们就能以root用户的身份,进入指定容器的终端,也就能操作容器内的文件了。
包含文件/端口映射的容器创建
虽然我们已经有方法进入容器内部了,但是还有一些情况,我们不希望容器和我们的主机过分隔绝。
- 配置文件需要频繁调试,每次靠
docker exec
太麻烦; - 容器内部会有较大文件,不希望容器体积过大,希望把容器内部数据挂载在主机上;
- 应用服务需要以端口形式暴露到主机端口,才能让我们或者别的进程访问;
所以更多的时候,我们创建容器时,需要指定一些容器和主机的”联通管道“。以运行nginx容器为例:
docker run --name nginx.1 -p 80:80 -v --restart=always /home/user/nginx/conf.d:/etc/nginx/conf.d -d nginx
- -p 主机port:容器port 将容器的端口映射到主机的端口,这样访问主机ip:主机port就可以访问容器内的服务了;
- -v 主机路径:容器路径 将容器内的文件路径映射到主机路径,这样容器调用此路径时就会调用主机的文件,我们修改配置文件就直接修改主机路径下的文件即可(注意挂载文件路径时,要保证主机目录下有完整的应有文件,推荐先复制容器内文件出来,再映射,具体见下文);
- –restart=always 设置容器随docker服务启动而自启动。
容器管理技巧
上文提到有时我们需要修改容器内部的文件,那么第一简单的方式就是在容器内部安装vim
A
docker exec -it 容器ID /bin/bash
apt-get update
apt-get install vim
B
但是有些容器内部连apt工具也没有,那么我们就只能间接的修改了,那就是把文件从容器里面copy到主机,在主机完成修改后再copy回去。
1.copy容器文件到主机
docker cp 容器id/name:container_filepath local_filepath
2.修改文件
3.copy主机文件到容器
docker cp local_filepath 容器id/name:container_filepath
C
一种更一劳永逸的方式就是把容器内部的文件夹映射到主机上,这样以后直接在主机修改文件内容,容器调用的时候就会直接调用主机上的文本。注意在映射前,把容器中文件夹中的文件全部copy到主机路径下,这样再去挂载比较稳妥,否则有可能会出现容器找不到需要的文件而报错的情况。
以nginx容器为例,记录一下全过程:
1.创建一个辅助容器
docker run --name nginx.0 -p 80:80 -d nginx
2.copy容器路径下全部文件到主机路径
docker cp nginx.0:/etc/nginx/conf.d /home/user/nginx/
3.停止并删除辅助容器
docker stop nginx.0 && docker rm nginx.0
4.创建映射文件的容器
docker run --name nginx.1 -p 80:80 -v --restart=always /home/user/nginx/conf.d:/etc/nginx/conf.d -d nginx
至于怎么知道容器里的文件路径时怎么样的,可以docker exec
进容器里面去找;或者访问Dockerhub去找这个镜像的官方文档,好的文档里面会介绍重要文件的路径和镜像的使用tips。
docker file与docker compose
还有更优雅的方式创建并管理容器,那就是docker file和docker compose的方法。
具体在另一篇文章记录。