Docker常用操作指令

一、Docker镜像操作

1.显示镜像

docker images

显示所有的镜像(包括中间层)

docker images -a

显示镜像ID

docker images -q

组合

docker images -qa

显示镜像的摘要信息

docker images --digests

显示完整的镜像信息

docker images --no-trunc

2.搜索镜像

docker search XX

3.下载镜像

docker pull XX

指定版本下载

docker pull XX:版本

4.删除镜像

docker rmi 镜像名称:版本

强制删除

docker rmi -f 镜像名称:版本

删除多个中间用空格隔开

docker rmi -f 镜像名称:版本 镜像名称:版本

清除全部

docker rmi -f $(docker images -qa)

二、Docker容器操作

1.创建并启动容器
--name=“容器新名字”:为容器指定一个名称:
-i:以交互模式运行容器,通常于-t一起使用
-t:为容器重新分配一个伪输入终端,通常于-i一起使用
-d: 后台运行容器,并返回容器ID;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口

docker run -it -p 8888:8080 tomcat

随机端口

docker run -it -P tomcat

docker run -it --name(别名) 镜像ID 来运行一个容器,取别名,交互模式运行,以及分配一个伪终端
守护式:

docker run -di --name(别名) 镜像ID

常用:

docker run -it --name 别名 -d -p 8888:8080 镜像ID

映射命令:

docker run --name 容器名称 -d -p (服务器端口):(Docker端口) image-name
docker run --name tomcattest7 -d -p 8888:8080 镜像ID

2.列出容器
列出正在运行的容器

docker ps

显示所有的容器

docker ps -a

查看停止的容器

docker ps -f status=exited

3.退出容器
容器停止退出

exit 

容器不停止退出

Ctrl+P+Q

4.进入容器

docker attach 容器ID or 容器名

5.启动容器

docker start 容器ID or 容器名

6.重启容器

docker restart 容器ID or 容器名

7.停止容器

docker stop容器ID or 容器名 

直接杀掉进程

docker kill 容器ID or 容器名

8.删除容器

docker rm 容器ID or 容器名

强制删除

docker rm -f 容器ID or 容器名

删除多个中间用空格隔开

docker rm -f 容器ID or 容器名 容器ID or 容器名

 清除全部

docker rm -f $(docker ps -qa)

9.进入运行中的容器

docker exec -it 容器名称 或者 容器ID 
docker exec -it edbef195b590 
docker exec -it edbef195b590 /bin/bash

10.tomcat启动外部无法访问
webapps目录为空,webapps.dist下存在我们需要的东西
进入容器目录

docker exec -it 容器ID /bin/bash

修改webapps为webapps2

mv webapps webapps2

修改webapps.dist为webapps

mv webapps.dist webapps

11.提交运行时的容器为镜像

docker commit -a='作者' -m='备注' 运行时容器ID 新镜像名称:TAG(版本)

12.推送镜像到hub服务器
步骤一:
https://hub.docker.com/ 注册下 得到docker id和密码
kaylove/abcd1234
步骤二:
我们用docker login登陆hub服务器
步骤三:
docker push推送

docker push 本地镜像名称:TAG(版本)

13.推送到阿里云
步骤一:
进入:https://cr.console.aliyun.com  阿里云镜像控制台,镜像控制台密码单独设置;
步骤二:
进入控制台,我们先创建命名空间,再创建镜像;
创建个人实例
创建命名空间
创建镜像仓库
docker 命令操作
1)登录阿里云Docker Registry

sudo docker login [email protected] registry.cn-shenzhen.ali
yuncs.com

用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。
您可以在访问凭证页面修改凭证密码。
2)从Registry中拉取镜像

sudo docker pull registry.cn-shenzhen.aliyuncs.com/kayluo/tomcat:[镜像版本号]

3)将镜像推送到Registry

sudo docker login --username=kay.5****@qq.com registry.cn-shenzhen.aliyuncs.com
sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/kayluo/tomcat:[镜像版本号]
sudo docker push registry.cn-shenzhen.aliyuncs.com/kayluo/tomcat:[镜像版本号]

--请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。
14.查看容器日志
进入目录:/var/lib/docker/containers/
.log结尾的就是日志

三、Docker容器目录挂载

1.语法

docker run -it -v  /宿主机目录:/容器目录 镜像ID
docker run -it -v /home/testData:/cData 2173a72bba6b
docker run --name tomcattest7 -d -p 8888:8080 -v /home/testData:/cData 镜像ID

2.多目录挂载

docker run -it -v /宿主机目录:/容器目录 -v /宿主机目录2:/容器目录2  镜像名

注意:
如果你同步的是多级目录,可能会出现权限不足的提示;
这是因为Centos7中的安全模块selinux把权限禁掉了,我们需要添加  --privileged=true 来解决挂载的目录没有权限的问题;

docker run --name tomcattest7 -d -p 8888:8080 -v /home/testData:/cData 镜像ID --privileged=true

3.挂载只读目录

docker run -it -v  /宿主机目录:/容器目录:ro 镜像ID
docker run --name tomcattest7 -d -p 8888:8080 -v /home/testData:/cData:ro 镜像ID

四、Docker常用软件安装

1.tomcat安装和挂载
第一步:运行容器 docker run -it --name 别名 -d -p 8888:8080 镜像ID

docker exec -it 容器ID /bin/bash
mv webapps webapps2
mv webapps.dist webapps
exit

第二步:宿主机里home目录下新建tomcat目录,复制容器里conf,webapps到宿主机 

docker cp  容器id:/usr/local/tomcat/conf  /home/tomcat/conf/  
docker cp  容器id:/usr/local/tomcat/webapps  /home/tomcat/webapps/  

第三步:把容器里的tomcat里的webapp,logs,conf挂载到宿主机tomcat目录下,方便上传代码,同步持久化日志,以及方便配置tomcat;关掉容器,启动容器:

docker run -d --name 别名 -p 80:8080 -v /home/tomcat/conf/:/usr/local/tomcat/conf/  -v /home/tomcat/webapps/:/usr/local/tomcat/webapps/ -v /home/tomcat/logs/:/usr/local/tomcat/logs/   镜像名称

第四步:配置tomcat server.xml 以及 同步上传war包
在<Host 节点下面
<Context path="" docBase="/usr/local/tomcat/webapps/WebTest" debug="0" reloadable="true" />   2.mysql5.7的安装和挂载
第一步:运行容器
第二步:宿主机里home目录下新建mysql目录,复制容器里conf,webapps到宿主机

docker cp  容器id:/etc/mysql/conf.d  /home/mysql/
docker cp  容器id:/var/log  /home/mysql/
docker cp  容器id:/var/lib/mysql  /home/mysql/ 

关掉容器,重新带挂载启动
第三步:把容器里的mysql里的webapp,logs,conf挂载到宿主机tomcat目录下,方便上传代码,同步持久化日志,以及方便配置tomcat

docker run --name 别名 -itd -p 3306:3306 -v /home/mysql/conf/:/etc/mysql/conf.d/ -v /home/mysql/log/:/var/log -v /home/mysql/mysql/:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=123456  镜像ID

第四步:用sqlyog连接docker里的数据库,导入sql脚本 
注意点:运行的项目里的数据库连接地址,要写docker里的mysql容器所在的虚拟IP地址;容器间通信IP;
查看容器元信息:

docker inspect 容器ID

找到 IPAddress : 对应的地址

五、Docker的迁移与备份

我们开发的时候,经常自定义镜像,然后commit提交成镜像到本地仓库,但是我们发布到客户服务器的时候,可以用前面讲得搞到hub官方,或者阿里云,但是有些机密性的项目,是禁止公网存储的,所以我们只能通过docker镜像备份和迁移实现;
备份镜像:

docker save -o 备份镜像的名称  源镜像名称:tag版本
docker save -o mytomcat7.1.tar tomcat7:7.1

备份在当前路径下
恢复镜像:

docker load -i 镜像文件
docker load -i mytomcat7.1.tar

六、DockerFile

1).简介
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于操作系统(centos或者Ubuntu)基础镜像并最终创建的一个新镜像;
我们前面讲过的用手工的方式,修改配置文件,或者添加,删除文件目录的方式,来构建一种新镜像;这种手工方式麻烦,容易出错,而且不能复用;
我们这里讲Dockerfile,用脚本方式来构建自动化,可复用的,高效率的创建镜像方式,是企业级开发的首选方式;
在软件系统开发生命周期中,采用Dockerfile来构建镜像;
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作;
3、对于运维人员:在部署时,可以实现应用的无缝移植。
2).Dockerfile常用指令
FROM image_name:tag 定义了使用哪个基础镜像启动构建流程

MAINTAINER user_info 声明镜像维护者信息

LABEL key value 镜像描述元信息(可以写多条)

ENV key value 设置环境变量(可以写多条)

RUN command 构建容器时需要运行的命令(可以写多条)

WORKDIR path_dir 设置终端默认登录进来的工作目录

EXPOSE port 当前容器对外暴露的端口

ADD source_dir/file dest_dir/file 将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
source_dir:当前目录,通常为放置dockerFile文件的目录
file dest_dir:要生成的目录
file:文件名

COPY source_dir/file dest_dir/file 和ADD相似,但是如果有压缩文件是不能解压

VOLUME 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等

CMD 指定容器启动时要运行的命令,假如有多个CMD,最后一个生效
exec 模式和 shell 模式
CMD 指定容器启动时要运行的命令,假如有多个CMD,最后一个生效
语法格式:    

CMD <command> 或
CMD ["<executeable>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]

ENTRYPOINT 指定容器启动时要运行的命令ONBUILD 当构建一个被继承的DockerFile时运行的命令,父镜像在被子镜像继承后父镜像的onbuild被触发。可以吧ONBUILD理解为一个触发器。
编写Dockerfile的时候,其他命令都是为了自身镜像服务的,只有ONBUILD是为了子镜像服务;
简单实例:父镜像Dockerfile:

FROM centos
ONBUILD RUN yum -y install vim
CMD /bin/bash

子镜像简单点:

FROM parent

一句即可;
当构建子镜像的时候,父镜像的ONBUILD会触发,子镜像直接安装vim;
实际应用,一般是ONBUILD里执行的是一些父镜像暂时无法执行的东西,比如一些COPY,ADD,可以启动一些服务,父镜像当做模板一些,仅仅提供基础支持,然后具体实行是子镜像操作。
3).Dockerfile构建自定义centos
编写Dockerfile:文件名为myCentosDockerfile 不要加后缀

FROM centos
MAINTAINER kaytest
LABEL name="kaytest CentOS Image" \
    build-date="20191112"
ENV WORKPATH /home/
WORKDIR $WORKPATH
RUN yum -y install net-tools
RUN yum -y install vim
EXPOSE 80
CMD /bin/bash

构建:
进入linux cd /home/ 目录下 创建dockerfile文件夹,把刚刚编写的dockerFile文件放进去
进入dockerfile目录 cd /home/dockerfile/

docker build -f DockerfileName -t 镜像名:TAG .
docker build -f myCentosDockerFile -t kaytestcentos:1.0 .

注意:镜像名称必须小写,可以用/。结尾需用加个空格再用英文句号结束
运行: docker run -it 镜像ID
查看镜像历史 docker history 镜像ID
4).Dockerfile构建自定义tomcat
编写Dockerfile:文件名为myTomcatDockerfile 不要加后缀

FROM centos
MAINTAINER kaytomcattest
LABEL name="kay Tomcat Image" \
build-date="20191115"
COPY  copyright.txt /home/copyright.txt
ADD server-jre-8u151-linux-x64.tar.gz /home/
ADD apache-tomcat-8.5.37.tar.gz /home/
ENV WORKPATH /home/apache-tomcat-8.5.37/
WORKDIR $WORKPATH
ENV JAVA_HOME /home/jdk1.8.0_151
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /home/apache-tomcat-8.5.37/
ENV CATALINA_BASE /home/apache-tomcat-8.5.37/
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
CMD ["/home/apache-tomcat-8.5.37/bin/catalina.sh","run"]

构建:
进入linux cd /home/ 目录下 创建dockerfile文件夹,把刚刚编写的dockerFile文件放进去,把copyright.txt文件放进去,把server-jre-8u151-linux-x64.tar.gz文件放进去,把apache-tomcat-8.5.37.tar.gz文件放进去
进入dockerfile目录 cd /home/dockerfile/

docker build -f DockerfileName -t 镜像名:TAG .
docker build -f myTomcatDockerFile -t kaytesttomcat:1.0 .

注意:镜像名称必须小写,可以用/。结尾需用加个空格再用英文句号结束
运行:参照挂载运行
5).Dockerfile构建自定义redis
编写Dockerfile:文件名为myRedisDockerfile 不要加后缀

#
# Dockerfile for Redis-4.0.2
#
FROM centos:7
MAINTAINER kaytest
RUN yum clean all
RUN yum -y update
# Install libs
RUN yum install deltarpm rpm make tar gcc gcc-c++ epel-release -y

RUN mkdir -p /home/work/apps/
RUN mkdir -p /var/log/redis/
# Copy Redis tar.gz and auto uncompress
ADD redis-4.0.2.tar.gz /home/work/apps
ADD etc/redis.conf /etc/redis.conf

#COPY supervisord.conf /etc/supervisord.conf
VOLUME ["/home/work/apps/","/var/log/redis/"]
# Install redis
WORKDIR /home/work/apps/redis-4.0.2/
RUN make
RUN make && make install

#CMD ["/usr/bin/supervisord"]
CMD redis-server /etc/redis.conf

# Expose ports.
EXPOSE 6379

构建:
进入linux cd /home/ 目录下 创建dockerfile文件夹,把刚刚编写的dockerFile文件放进去,etc文件夹放过去包括里面的redis.conf文件,redis-4.0.2.tar.gz也放过去
进入dockerfile目录 cd /home/dockerfile/

docker build -f DockerfileName -t 镜像名:TAG .
docker build -f myTomcatDockerFile -t kaytestredis:1.0 .

注意:镜像名称必须小写,可以用/。结尾需用加个空格再用英文句号结束
运行:参照挂载运行
6).Dockerfile通过VOLUME实现容器卷
就是和之前 -v 命令差不多,把容器目录和宿主机目录挂载

VOLUME['/home/v1','/home/v2']

说明:前面用启动命令 -v 宿主机目录:容器卷目录  来实现容器卷目录挂载
但是由于定义Dockerfile的时候,并不能保证在所有的宿主机上都有这样的特定目录,
所以在Dockerfile定义中,只能指定容器卷目录;
编写Dockerfile:文件名为myCentosDockerfile 不要加后缀

FROM centos
VOLUME ["/home/v1","/home/v2"]
CMD /bin/bash

构建:参照上面
运行:守护式运行

docker run -di --name(别名) 镜像ID

测试:
运行后,我们进入容器的home目录,找到v1,v2两个容器卷目录;

docker exec -it 容器ID /bin/bash/
cd /home/

然后我们通过  docker inspect 容器ID   来查看下默认生成的容器卷对应的宿主机目录;在Mounts节点下,一般目录为空,对应容器的/home/v1目录。
通过新建文件和 修改,我们发现,能实现同步,没毛病;
个人认为,要实现容器卷,还是通过前面讲得-v启动命令,用dockerfile方式,比较操蛋,宿主机目录不能自定义;
7).CMD和ENTRYPOINT 的区别和联系
1.DockerFile中CMD, ENTRYPOINT 的区别和联系
CMD, ENTRYPOINT都是容器启动的时候,执行执行命令;都支持exec和shell方式;一般用法,是单独一个CMD,或者先ENTRYPOINT,后CMD结合使用;
假如有多个CMD,启动的时候带命令参数,会覆盖前面的CMD命令,最后一个命令生效,所以我们平时用CMD的时候,有一种情况的就是单独一个CMD命令即可,启动命令也不带参数;
我们主要学习通常用法;下面测试下;
先看下tomcat的官方镜像的dockerfile;

由于CMD命令假如有多个,会被覆盖 ,只有最后一个执行;所以我们测试启动;

像这种启动不带参数 是没毛病的,tomcat可以正常启动;

但是我们如果加上参数 比如 /bin/bash  或者 ls -l

那就会覆盖dockerfile中的CMD ["catalina.sh","run"],tomcat就不执行;

执行的是具体的启动时候带的参数;

我们再看下redis官方dockerfile;

这种就是我们说的第二种常见用法,先搞个ENTRYPOINT 执行下执行命令,然后后面跟CMD来拼接具体的执行参数;
最终执行的 是 docker-entrypoint.sh redis-server;
经过上面两个案例,相信大伙对CMD, ENTRYPOINT 有一定的了解;
我们再看看详细语法;

CMD语法;

CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)

第一种用法:运行一个可执行的文件并提供参数。
第二种用法:为ENTRYPOINT指定参数。
第三种用法(shell form):是以”/bin/sh -c”的方法执行的命令。

ENTRYPOINT 语法;

ENTRYPOINT [“executable”, “param1”, “param2”] (exec 格式, 推荐)
ENTRYPOINT command param1 param2 (shell 格式)

我们一般开发 官方都建议用 exec格式;好使;

下面我们通过一些简单实例,来具体看下CMD, ENTRYPOINT 的实际用法;
第一个dockerfile 

FROM centos
CMD echo "abc"
#CMD ["/bin/echo", "defg"]

我们可以运行测试,看看结果,以及把第二个CMD去掉 看看结果;
以及 运行命令后面跟运行参数 看看结果;能明白CMD多个的话 只有最后一个生效;

第二个dockerfile

FROM centos
ENTRYPOINT ["ls"]
CMD ["-l"]

这个dockerfile 我们用 ENTRYPOINT 执行一个ls命令 然后CMD 追加参数 
相当于这个CMD是默认的一个参数 假如需要更换参数 启动的时候 ,我们直接替换即可;

七、Docker私有仓库

1.简介
Docker私有仓库主要是企业内部用来存放镜像的仓库,相对官方仓库以及阿里云仓库,具有更高的保密安全级别;
2.仓库搭建
第一步:拉取私有仓库镜像 (私有仓库程序本身就是一个镜像)

docker pull registry

第二步:启动私有仓库容器

docker run -di --name=myRegistry -p 5000:5000 registry

第三步:测试

http://192.168.1.112:5000/v2/_catalog

看到这个 说明启动OK。因为仓库里还没有镜像,所以就是空的;

第四步:

sudo vi /etc/docker/daemon.json 修改daemon.json,让docker信任私有仓库地址
"insecure-registries": ["192.168.1.112:5000"]

​​​​​​​

第五步:修改配置后重启docker;

systemctl restart docker

3.私有仓库测试
第一步:标记此镜像为私有仓库的镜像

docker tag 镜像名:TAG 192.168.1.112:5000/仓库镜像名
docker tag tomcat:7 192.168.1.112:5000/mytomcat7

第二步:上传镜像到私有仓库

docker push 192.168.1.112:5000/mytomcat7

此时私有仓库里已经有了这个镜像;
第三步:删除192.168.1.112:5000/mytomcat7本地仓库镜像

docker rmi -f 192.168.1.112:5000/mytomcat7

第四步:从私有仓库拉取192.168.1.112:5000/mytomcat7镜像,并运行;

docker run -itd -p 8080:8080 192.168.1.112:5000/mytomcat7

第五步:浏览器运行 http://192.168.1.112:8080测试

八、Docker shipyard容器(停止更新)

1.拉取shipyard相关镜像

docker pull shipyard/shipyard
docker pull swarm
docker pull shipyard/docker-proxy
docker pull alpine 
docker pull microbox/etcd 
docker pull rethinkdb

2.构建shipyard容器

docker run -ti -d --restart=always --name shipyard-rethinkdb rethinkdb

docker run -ti -d -p 4001:4001 -p 7001:7001 --restart=always --name shipyard-discovery microbox/etcd:latest -name discovery

docker run -ti 
-d -p 2375:2375 --hostname=$HOSTNAME 
--restart=always --name shipyard-proxy 
-v /var/run/docker.sock:/var/run/docker.sock 
-e PORT=2375 shipyard/docker-proxy:latest 

docker run -ti -d --restart=always --name shipyard-swarm-manager 
swarm:latest manage --host tcp://0.0.0.0:3375 etcd://<IP-OF-HOST>:4001

docker run -ti -d --restart=always --name shipyard-swarm-agent 
swarm:latest join --addr <ip-of-host>:2375 etcd://<ip-of-host>:4001 

docker run -ti -d --restart=always --name shipyard-controller --link 
shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -
p 8888:8080 dockerclub/shipyard:latest server -d tcp://swarm:3375
注:替换 <IP-OF-HOST >为实际宿主机地址
访问shipyard<ip-of-host>:8080
默认用户名:admin 密码:shipyard

安装docker‐compose 

yum install docker-compose

执行 docker‐compose
进入docker-compose.yml的同级目录

docker-compose up -d

九、Docker portainer可视化官方推荐

1.

docker volume create portainer_data

2.

docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

3.

http://localhost:9000

4.设置admin用户密码,需要输入两次相同的密码

十、Docker 对所有镜像/容器操作命令(慎用)

docker中 启动所有的容器命令

docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)

docker中 关闭所有的容器命令

docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

docker中 删除所有的容器命令

docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)

docker中 删除所有的镜像

docker rmi $(docker images | awk '{print $3}' |tail -n +2)

猜你喜欢

转载自blog.csdn.net/qq_36539042/article/details/117594055
今日推荐