文章目录
-
- docker 常用命令
-
1.1 启动停止
- 1.2 配置aliyun容器镜像加速器
- 1.3 镜像操作
- 1.4 容器相关
-
- 构建镜像
-
2.1 修改容器,通过容器构建镜像
- 2.2 编写dockerfile构建镜像
-
2.2.1 dockerfile常用参数
* 2.2.2 构建镜像 -
- 其他问题
-
3.1 docker -v 挂载宿主机目录没有权限访问
-
3.1.1 关闭selinux
* 3.1.2 给需要挂载的宿主机目录配置安全上下文(selinux 标签)
1. docker 常用命令
1.1 启动停止
1
2
3
4
5
6 1systemctl start docker # 启动docker服务
2systemctl stop docker # 关闭docker服务
3systemctl enable docker # 设置开机自启动
4docker version # 查看docker 版本
5
6
1.2 配置aliyun容器镜像加速器
1
2
3
4
5
6
7
8
9
10 1mkdir -p /etc/docker
2tee /etc/docker/daemon.json <<-'EOF'
3{
4 "registry-mirrors": ["https://1fc43mcq.mirror.aliyuncs.com"]
5}
6EOF
7systemctl daemon-reload
8systemctl restart docker
9
10
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:容器目录 宿主机目录
拷贝容器文件到宿主机
创建镜像
1
2
3 1docker run --name conner_centos -i -t -d -p 1234:2234 -v /tmp:/tmp:ro 688353a31fde
2
3
拷贝宿主机文件到容器
1
2
3 1docker cp lbz 1b8ecd002608:/root
2
3
拷贝容器文件到宿主机
1
2
3 1docker cp 1b8ecd002608:/root/lbz/connor /tmp
2
3
清除所有容器
1
2
3
4
5
6 1# 方法一
2for i in `docker ps -a|awk '{print $1}'|grep -v CONTAINER`; do docker rm -f $i; done;
3# 方法二
4docker rm -f $(docker ps -aq)
5
6
2. 构建镜像
2.1 修改容器,通过容器构建镜像
根据基础镜像创建容器
修改容器
提交新镜像
1
2
3
4 1# docker commit -m='描述信息' -a='作者' 容器id或容器名称 镜像名:tag
2docker commit -m='test2020' -a='connor' 2d96a1f2d3e8 centos7:v1.0
3
4
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 1# 指定基础镜像
2FROM accab2322a74
3# 指定作者
4MAINTAINER connor
5# 添加环境变量
6ENV test_path /usr/local/ansible
7# 构建过程中执行命令
8RUN mkdir -p ${test_path}
9# 拷贝文件或目录
10COPY a.txt ${test_path}
11# 拷贝文件
12ADD 1.txt ${test_path}
13# 指定默认工作目录
14WORKDIR ${test_path}
15# 添加默认挂载点,在docker run 时如果不指定-v 则默认挂载到随机目录
16VOLUME ["/data1","/data2"]
17# 启动容器时运行,如果docker run后面添加了参数则会在ENTRYPOINT参数中追加
18ENTRYPOINT ["tail"]
19# 启动容器时运行,默认追加命令(参数),如果有多个CMD命令,只执行(添加)最后一条命令(参数),如果docker run后面添加了参数则会将 CMD中的参数覆盖
20CMD ["-f", "/usr/local/ansible/1.txt"]
21# 声明了容器应该打开的端口并没有实际上将它打开,在不使用-p(指定宿主机端口映射)和-P(宿主机随机端口映射)时该端口并不会打开
22# 作用1:为了让运维人员知晓,需要映射哪些端口 作用2:使用随机端口映射时,容器默认使用EXPOSE暴露端口
23EXPOSE 8080
24
25
根据dockerfile构建新的镜像
1
2
3
4 1# docker build -f dockerfile文件名 -t 镜像:标签 .(注意这里还有个点)
2docker build -f test_dockerfile -t centos7:v1.7 .
3
4
运行容器
1
2
3
4 1# -P 指定随机端口映射,[-f /usr/local/ansible/a.txt] 为启动参数,默认会将dockerfile中的CMD参数覆盖,但不会覆盖ENTRYPOINT,会与ENTRYPOINT参数组合成新的命令,当没有ENTRYPOINT时,则为独立运行的命令
2docker run -it -d -P centos7:v1.7 -f /usr/local/ansible/a.txt
3
4
此处可以看到容器端口8080已经对外开放
此处可以看到dockerfile 的CMD的值已经被替换
1
2
3 1docker inspect -f {{".Config.Cmd"}} eab086bf2f8c
2
3
此处可以查看容器挂载宿主机的具体目录
1
2
3 1docker inspect -f {{".Mounts"}} eab086bf2f8c
2
3
此处可以验证得出容器挂载宿主机成功
3. 其他问题
3.1 docker -v 挂载宿主机目录没有权限访问
两种方法选择一种即可
3.1.1 关闭selinux
1
2
3
4
5 1# 修改配置文件需要重启服务器才能生效,所以修改配置后还需要使用命令临时修改
2sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
3setenforce 0
4
5
3.1.2 给需要挂载的宿主机目录配置安全上下文(selinux 标签)
1
2
3
4 1# /data为宿主机提供挂载的目录
2chcon -Rt svirt_sandbox_file_t /data/
3
4