docker的两个概念,image和container。image是一个镜像,通过镜像可以创建一个容器。容器在运行结束后,docker会保存容器的状态,下次可以再次启动该容器,而不用通过image再创建一个容器。
docker images
docker image ls
列出image
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos5-x64-compile v4 69169220c1b0 11 months ago 1.42GB
docker load
docker image load
从镜像文件加载一个镜像
--input , -i | Read from tar archive file, instead of STDIN |
# docker load -i centos5-x86-compile.tar
还可以从docker仓库pull镜像。
# docker pull centos:7
container通过run创建,run创建的时候会指定一个运行进程,当进程结束的时候container也退出了。因此这个进程通常是/bin/bash。退出后的container及其状态仍然保存在docker中,可以通过docker ps -a查看,下次可以从上次的退出状态继续运行container。
创建container.
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
--interactive , -i Keep STDIN open even if not attached
--user , -u 指定用户和组 Username or UID (format: <name|uid>[:<group|gid>])
--volume , -v Bind mount a volume 绑定目录
--detach , -d Run container in background and print container ID
--name Assign a name to the container
$ docker run -it -v /work:/work -u 1001:1001 --name centos5-x64 centos5-x64-compile:v4 /bin/bash
2024/6/8更新
fedora上访问挂载目录的时候,出现permission denied,有2个解决办法
1 关闭selinux
# setenforce 0
2 run的时候指定--priviledged=true
# docker run -it -v /home/yuanjp:/home/yuanjp -u 1000:1000 --privileged=true --name ubuntu16.04 ubuntu:16.04 /bin/bash
run的时候,可以制定workdir
--workdir /home/yuanjp
初始container没有用户的问题
上述使用1000用户,但是初始的image,是没有这个用户的。因此run之后,使用exec,以root用户运行,然后创建用户
# docker exec -it -u 0 ubuntu16.04 /bin/bash
root@9003b39becde:/# useradd -u 1000 -U --shell /bin/bash --home-dir /home/yuanjp yuanjp
此时,退出run,以start运行
# docker start -i ubuntu16.04
yuanjp@9003b39becde:/$ whoami
yuanjp
启动一个或多个已停止的container。
docker start [OPTIONS] CONTAINER [CONTAINER...]
--interactive , -i Attach container’s STDIN
$ docker start -i centos5-x64
后面是name或者id。
参考:
https://docs.docker.com/engine/reference/run/
https://docs.docker.com/engine/reference/commandline/start/