docker快速入门
Docker快速入门
1. 使用镜像
拉取镜像
1
docker pull image
镜像默认保存在
/var/lib/docker/overlay2
运行镜像
以上面的
ubuntu:18.04
为例,如果我们打算启动里面的bash
并且进行交互式操作的话,可以执行下面的命令。1
docker run -it --rm ubuntu:18.04 bash
通过
exit
退出这个容器列出镜像
1
docker image ls
删除镜像
1
docker image rm [id/name]
可以通过指定镜像名或者镜像id进行删除操作
使用Dockerfile定制镜像
创建Dockerfile文件
写入
1
2FROM nginx
RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.htmlFrom 指定基础镜像
RUN 执行shell命令 支持 && 串联命令 \ 单条命令换
构建镜像
在Dockerfile目录执行
1
docker build -t [镜像名] [上下文目录]
上下文目录不是用来指定dockerfile文件所在位置,而是告诉docker创建该镜像要用到哪个目录下的资源
RUN指令细节
一些初学者常犯的错误是把
Dockerfile
等同于 Shell 脚本来书写,这种错误的理解还可能会导致出现下面这样的错误:1
2RUN cd /app
RUN echo "hello" > world.txt如果将这个
Dockerfile
进行构建镜像运行后,会发现找不到/app/world.txt
文件,或者其内容不是hello
,之前说过每一个RUN
都是启动一个容器、执行命令、然后提交存储层文件变更。第一层RUN cd /app
的执行仅仅是当前进程的工作目录变更,一个内存上的变化而已,其结果不会造成任何文件变更。而到第二层的时候,启动的是一个全新的容器,跟第一层的容器更完全没关系,自然不可能继承前一层构建过程中的内存变化。
2. 操作容器
启动
新建容器并启动
1
docker run
例如:
打印后终止容器
1
docker run ubuntu:18.04 /bin/echo 'hello world'
启动终端,允许交互
1
docker run -it ubuntu:18.04 /bin/bash
-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i
则让容器的标准输入保持打开
启动已经终止的容器
1
docker container start [容器名/容器id]
该方式启动的容器默认就是在后台运行
守护态运行
添加
-d
参数可以让容器在后台运行1
2docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo
hello world; sleep 1; done"要获取容器的输出信息,可以通过
docker container logs
命令。终止
可以使用
docker container stop
来终止一个运行中的容器。并且容器指定的应用终止时,容器也自动终止。进入容器
在使用
-d
参数时,容器启动后会进入后台。某些时候需要进入容器进行操作,包括使用
docker attach
命令或docker exec
命令,推荐大家使用docker exec
命令。因为attach进入容器后,如果exit会导致进程终止。1
docker exec -it [容器] bash
导出和导入
导出容器
1
docker export [容器] > ubuntu.tar
导入容器
从容器快照中再导入为镜像
1
cat ubuntu.tar | docker import - test/ubuntu:v1.0
删除
删除指定容器
1
docker container rm [容器]
删除运行中的容器
1
docker container rm -f [容器]
清理所有终止态的容器
1
docker container prune
3. 数据管理
- docker数据卷
好处:
- 容器间可以共享数据卷
- 对数据卷的修改会立马生效
- 数据卷的修改不会影响镜像
- 容器删除后,数据卷依然存在
创建数据卷
1
docker volume create [卷名]
查看数据卷信息
1
docker volume inspect [卷名]
将数据卷挂载到容器中
下面创建一个名为
web
的容器,并加载一个数据卷
到容器的/usr/share/nginx/html
目录。1
2
3
4
5$ docker run -d -P \
--name web \
# -v my-vol:/usr/share/nginx/html \
--mount source=my-vol,target=/usr/share/nginx/html \
nginx:alpine删除卷
1
docker volume rm my-vol
清除无主数据卷
1
docker volume prune
将主机目录作为数据卷
使用
--mount
标记可以指定挂载一个本地主机的目录到容器中去1
2
3
4
5$ docker run -d -P \
--name web \
# -v /src/webapp:/usr/share/nginx/html \
--mount type=bind,source=/src/webapp,target=/usr/share/nginx/html \
nginx:alpine
4. 使用网络
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P
或 -p
参数来指定端口映射。
当使用 -P
标记时,Docker 会随机映射一个端口到内部容器开放的网络端口。
1 |
|
同样的,可以通过 docker logs
命令来查看访问记录。
1 |
|
使用 hostPort:containerPort
格式本地的 80 端口映射到容器的 80 端口,可以执行
1 |
|
左侧为主机端口,右侧为容器端口
动过port查看容器的端口映射情况
1 |
|