文章目录
1. docker 常用命令
1.1 启动停止
systemctl start docker # 启动docker服务
systemctl stop docker # 关闭docker服务
systemctl enable docker # 设置开机自启动
docker version # 查看docker 版本
1.2 配置aliyun容器镜像加速器
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://1fc43mcq.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
1.3 镜像操作
命令 | 说明 |
---|---|
docker search 关键字 | 在镜像仓库中搜索包含关键字的镜像 |
docker pull 镜像名称:tag | tag为镜像版本,如果不指定,默认为latest |
docker images | 查看本地镜像 |
docker inspect 镜像id or 镜像名称 | 查看镜像详细信息 |
docker rmi -f 镜像id or 镜像名:tag | -f 为强制删除 |
搜索镜像
拉取镜像
查看本地镜像
查看镜像底层信息
1.4 容器相关
命令 | 说明 |
---|---|
docker run --name 容器名称 -i -t -d -p 宿主机端口:容器端口 -v 宿主机目录:容器目录:ro 镜像id or 镜像名:tag | 创建镜像 , --name:指定容器名称,-i:交互模式访问 -t:分配一个伪终端,-p:端口映射,-v:目录映射 ro为只读,默认为读写 |
docker ps -a -q | -a:表示 查看所有容器,默认显示正在运行的容器,-q:只显示容器id |
docker stop 容器id或容器名称 | 停止容器 |
docker start 容器id或容器名称 | 启动容器 |
docker rm -f 容器id或容器名称 | 删除容器 -f 表示强制删除 |
docker logs 容器id或容器名称 | 查看容器日志 |
docker inspect 容器id或容器名称 | 查看容器详细信息 |
docker exec -it 容器id或容器名 bash | 以交互式进入容器 |
docker cp 宿主机目录 容器id:容器目录 | 拷贝宿主机文件到容器内 |
docker cp 容器id:容器目录 宿主机目录 | 拷贝容器文件到宿主机 |
创建镜像
docker run --name conner_centos -i -t -d -p 1234:2234 -v /tmp:/tmp:ro 688353a31fde
拷贝宿主机文件到容器
docker cp lbz 1b8ecd002608:/root
拷贝容器文件到宿主机
docker cp 1b8ecd002608:/root/lbz/connor /tmp
清除所有容器
# 方法一
for i in `docker ps -a|awk '{print $1}'|grep -v CONTAINER`; do docker rm -f $i; done;
# 方法二
docker rm -f $(docker ps -aq)
2. 构建镜像
2.1 修改容器,通过容器构建镜像
根据基础镜像创建容器
修改容器
提交新镜像
# docker commit -m='描述信息' -a='作者' 容器id或容器名称 镜像名:tag
docker commit -m='test2020' -a='connor' 2d96a1f2d3e8 centos7:v1.0
2.2 编写dockerfile构建镜像
语法规则
- 指令必须大写,且后面必须跟参数
- 第一条指令必须为FROM,指定Base Image(基础镜像)
- 指令顺序按从上到下依次执行
- 每条指令都会创建一个新的镜像层并提交
2.2.1 dockerfile常用参数
参数 | 说明 |
---|---|
FROM | 指定Base Image |
MAINTAINER | 指定作者 |
ENV | 设置环境变量 |
WORKDIR | 指定默认工作目录,即进入容器后默认进入的目录 |
VOLUME | 创建容器内部挂载点 |
RUN | 指定构建过程中需要执行的命令 |
CMD | 指定容器运行时需要执行的命令,有多条命令时只有最后一条生效 |
ENTRYPOINT | 指定容器运行时需要执行的命令 |
COPY | 拷贝文件或目录到镜像中 |
ADD | 拷贝文件到镜像中 |
EXPOSE | 指定容器暴露端口 |
2.2.2 构建镜像
创建dockerfile
# 指定基础镜像
FROM accab2322a74
# 指定作者
MAINTAINER connor
# 添加环境变量
ENV test_path /usr/local/ansible
# 构建过程中执行命令
RUN mkdir -p ${test_path}
# 拷贝文件或目录
COPY a.txt ${test_path}
# 拷贝文件
ADD 1.txt ${test_path}
# 指定默认工作目录
WORKDIR ${test_path}
# 添加默认挂载点,在docker run 时如果不指定-v 则默认挂载到随机目录
VOLUME ["/data1","/data2"]
# 启动容器时运行,如果docker run后面添加了参数则会在ENTRYPOINT参数中追加
ENTRYPOINT ["tail"]
# 启动容器时运行,默认追加命令(参数),如果有多个CMD命令,只执行(添加)最后一条命令(参数),如果docker run后面添加了参数则会将 CMD中的参数覆盖
CMD ["-f", "/usr/local/ansible/1.txt"]
# 声明了容器应该打开的端口并没有实际上将它打开,在不使用-p(指定宿主机端口映射)和-P(宿主机随机端口映射)时该端口并不会打开
# 作用1:为了让运维人员知晓,需要映射哪些端口 作用2:使用随机端口映射时,容器默认使用EXPOSE暴露端口
EXPOSE 8080
根据dockerfile构建新的镜像
# docker build -f dockerfile文件名 -t 镜像:标签 .(注意这里还有个点)
docker build -f test_dockerfile -t centos7:v1.7 .
运行容器
# -P 指定随机端口映射,[-f /usr/local/ansible/a.txt] 为启动参数,默认会将dockerfile中的CMD参数覆盖,但不会覆盖ENTRYPOINT,会与ENTRYPOINT参数组合成新的命令,当没有ENTRYPOINT时,则为独立运行的命令
docker run -it -d -P centos7:v1.7 -f /usr/local/ansible/a.txt
此处可以看到容器端口8080已经对外开放
此处可以看到dockerfile 的CMD的值已经被替换
docker inspect -f {{".Config.Cmd"}} eab086bf2f8c
此处可以查看容器挂载宿主机的具体目录
docker inspect -f {{".Mounts"}} eab086bf2f8c
此处可以验证得出容器挂载宿主机成功
3. 其他问题
3.1 docker -v 挂载宿主机目录没有权限访问
两种方法选择一种即可
3.1.1 关闭selinux
# 修改配置文件需要重启服务器才能生效,所以修改配置后还需要使用命令临时修改
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
setenforce 0
3.1.2 给需要挂载的宿主机目录配置安全上下文(selinux 标签)
# /data为宿主机提供挂载的目录
chcon -Rt svirt_sandbox_file_t /data/