Docker学习笔记和实践
一、Docker的安装与卸载
安装
-
删除docker,如果没有安装过可以不执行
# 删除老版本 ,没有安装过可以不执行 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
安装
# 安装一些工具包 sudo yum install -y yum-utils
-
添加阿里云镜像仓库
sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
安装
sudo yum install docker-ce docker-ce-cli containerd.io
-
也可以配置专属的加速地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
-
启动/停用/状态
#重启 docker systemctl restart docker # 启动docker systemctl start docker # 查看状态 systemctl status docker # 停止 docker systemctl stop docker
-
测试是否安装成功
# 虽然没有该镜像,但是会自动从阿里镜像仓库获取 docker run hello-world
卸载
systemctl stop docker
yum -y remove docker-ce
rm -rf /var/lib/docker #删除相关库
二、Docker常用命令
-
查看镜像各个版本地址:https://hub.docker.com/search?q=&type=image
-
查看docker的信息
# 查看docker的版本信息 docker version # 查看docker的详细信息 docker info
-
docker的【常用重要命令】
# 查看docker的命令文档 docker --help
-
查看docker的镜像信息
#查看docker的镜像列表 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest bd431ca8553c 3 days ago 667MB centos latest 300e315adb2f 4 months ago 209MB docker images --help #帮助列表 docker images -a #列表出本地的所有镜像 docker images -q #只查看镜像的ID docker images -qa #列表 docker images --digests #查看镜像的摘要信息 docker images --no-trunc #显示完整的镜像信息
-
查询镜像:docker search
docker search --help # 查看nginx命令 docker serch nginx # 查看nginx的镜像列表【选择OFFICIAL(官方)为OK的,START星星最多的】 docker search centos # 查看centos的镜像列表 docker search nginx --limit 2 # 查询前两条列表 docker search nginx --no-trunc # 不缩略展示摘要,展示详细信息
-
拉取镜像:docker pull
docker pull tomcat #拉取最新的tomcat,等价于[docker pull tomcat:latest] docker pull tomcat:8.7 #拉取指定版本的tomcat,可以在上上面网址进行查看版本列表 docker pull tomcat:8.7 nginx:latest #同时拉取多个镜像,拉取tomcat8.7版本和最新版的nginx
-
删除镜像
[root@localhost ~]# docker --help rm Remove one or more containers #删除一个或多个容器 rmi Remove one or more images #是你出一个或多个镜像 ------------------------------------------------------------------ docker pull hello-world #先下载一个最新的镜像 docker run hello-world docker rmi hello-world:latest #删除hello-world镜像,此时hello-world正在使用,删除步成功,需要强制删除 docker remi -f hello-world:latest # 强制删除镜像 docker rmi -f $(docker images -qa) # 强制删除所有的镜像
-
运行容器相关命令参数说明
[root@localhost ~]# docker run --help #常用几个注解 docker run [OPTIONS] IMAGE [COMMAND] --name="容器的名字": 为容器指定一个新的名称 -d: 后台以守护进程的方式运行 -i: 以交互模式运行,表示我要与你建立连接,通常与-t同时使用 -t: 为容器分配一个伪终端,也就是连接成功后的命令面板,与-i同时使用 -P: 随机端口映射 -p: 指定端口映射 ip:hostPort:containerPort ip::containerPort hostPort:containerPort containerPort
-
运行容器 并建立连接
[root@localhost ~]# docker run -it centos # 运行镜像centos,自定义生成容器名字 [root@a7d26339f9e3 /]# ls #进入到容器内部 bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@localhost ~]# docker ps #另外一个终端连接服务器,查看正在运行的容易,可以查看到名字为pedantic_maxwell CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a7d26339f9e3 centos "/bin/bash" 14 seconds ago Up 12 seconds pedantic_maxwell ----------------------#指定容器名字的方式运行 ------------------------------- [root@localhost ~]# docker run -it --name myFirstCentos centos /bin/bash [root@d93f6a45e650 /]# ls [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d93f6a45e650 centos "/bin/bash" 9 seconds ago Up 9 seconds myFirstCentos -------------------------------备注-------------------------------------------- /bin/bash 为容器的默认运行的进程,可加可不加 docker中必须保持一个默认的进程在运行,这个进程就是bash进程,如果不运行,容器就会运行结束退出
-
进入容器后退出容器内部面板
方法 | 区别 |
---|---|
输入exit后回车 | 退出后容器停止运行 |
crtl+P+Q | 退出后容易没有停止运行,再次连接docker attach 容器名字/容器ID |
- 后台运行的方式运行容器【docker容易后台运行,必然有一个前台程序与之交互】
备注: docker机制【后台运行必须有一个前台程序,否则容器在运行完后就结束了,所以使用docker ps 查看正在运行的容器为空】
[root@localhost ~]# docker run -d tomcat # -d 后台运行,但是由于
f980daf7a8d142d600712b9ec4d88964ec1c1d7aed466397500bfc8a5acb7839
所以运行时需要采用下面两种方式:-p 指定映射端口 -P随机生成端口【可以通过docker ps查看端口映射情况】
[root@localhost ~]# docker run -d -p 8089:8080 tomcat
[root@localhost ~]# docker run -d -P tomcat #后台运行可以使用后面的docker logs命令查看日志
- 查看正在运行的容器的【ID】或者【名字】
docker ps #查看正在运行的容器
docker ps -a #查看历史所有运行的容器
docker ps -a #查看历史运行的所有容易的 ID
docker ps -n #查看几个
- 查看容器的日志
docker logs --help # 日志命令的帮助文档
docker logs -f myFirstCentos/8625b8c2a39f #查看容器id是多少或者容器名字[docker ps获取] 的日志
docker logs -n 5 myFirstCentos # 查看容器名字为myFirstCentos的五行日志
- 停掉容器
docker kill 容器名字/容器ID #强制停止,相当于 kill -9
docker stop 容器名字/容器ID #会先发送停止信号,然后慢慢停止
-
再次连接上容器
# 直接进入容器命令终端,不会开启新的进程 #crtl+p+q退出后 docker attach 容器名字/容器ID docker exec -t 容器名字/容器ID /bin/bash #进入容器 # 在容器打开新的终端,会启用新的进程, 以下命令相当于:在容器内部的tmp目录下执行命令[ls -l] docker exec -t 容器名字/容器ID ls -l /tmp/
-
查看容器的详细细节
docker inspect 容器名字/容器ID #查看容器的细节
-
拷贝宿主机文件到容器和拷贝容器文件到宿主机
docker cp 容器名字/容器ID:/tmp/yum.log /root/ #将容器的log文件拷贝到主机的root下 docker cp /root/tempFile/ 容器名字/容器ID:/tmp/ #拷贝文件夹到容器内部
-
提交容器使之成为一个新的副本[使用阿里镜像最新版本的tomcat]
docker pull tomcat #拉取tomcat docker run -it -p 8888:8080 tomcat # 运行tomcat #tomcat 运行成功,但是会发现浏览器访问:localhost:8080无法访问,进入tomcat容器内发现webapps文件内 #容为空,所以修改webapps名字为webapps-temp,修改文件webapps.dist名字为:webapps #将上述修改后的tomcat重新提交为一个镜像,重新打开一个终端界面 [root@localhost ~]# docker commit -a="我是作者" -m="我是描述信息" dbd29ce1824e test/mytomcat:1.2 sha256:1d468ef2bb3d8487b6a157e3eac3d2ea69bfbccffcc86791a45aae1e4424ab73 [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE test/mytomcat 1.2 1d468ef2bb3d 8 seconds ago 672MB [root@localhost ~]# docker run -d -p 8090:8080 test/mytomcat:1.2 # localhost:8090 访问正常
-
查看以前运行过的容器然后重新运行
docker ps -a #查看之前运行过的容器 ID docker start 容器ID #启动容器 docker run -it 容器ID /bin/bash #进入容器的控制台
-
Docker的容器数据卷,作用【让宿主机和容器内指定文件夹的数据实时同步,以及容器停后,宿主机修改文件下的内容,容器再次启动后宿主机修改内容自动同步到容器内】使用centos做测试
#docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名字 [root@localhost ~]docker run -it -v /myDataVolume:/dataVolumeContainer centos #文件夹不用创建自动生成 docker inspect 容器ID #查看 详情是否绑定成功 ``` "HostConfig": { "Binds": [ "/myDataVolume:/dataVolumeContainer" ], ``` # 在上面两个文件 夹创建文件并写入内容都会实时同步 [root@localhost ~]docker run -it -v /myDataVolume2:/dataVolumeContainer2:ro centos # ro[read Only] 这样容器内只能读文件不能写文件,宿主机可读可写
-
初识dockerFile【命令底层实现】,通过dockerFile构建对象
#创建并编辑dockerFile文件夹,dockerFile无法指定宿主机,但是可以可以通过docker inpect ID,查看默认对应的宿主机文件目录 [root@localhost mydocker]# vim dockerFile FROM centos #来自centos镜像 VOLUME ["/dataVolumecontainer1","/dataVolumeContainer2"] # 创建两个数据卷 CMD echo "finish, --------success" # CMD /bin/bash [root@localhost mydocker]docker build -f /home/mydocker/dockerFile -t test/mtCentos . #根据dockerFile构建镜像,-f后面跟dockerFile的路径,-t后跟构建名字为test/mtCentos的镜像,docker images查看,注意后面的点【.】表示指定镜像构建过程 中的上下文环境目录 Sending build context to Docker daemon 2.048kB Step 1/4 : FROM centos ---> 300e315adb2f Step 2/4 : VOLUME ["/dataVolumecontainer1","/dataVolumeContainer2"] ---> Running in c95a4622436e Removing intermediate container c95a4622436e ---> 6d48a0a29080 Step 3/4 : CMD echo "finish, --------success" ---> Running in 7fbb1faa44b3 Removing intermediate container 7fbb1faa44b3 ---> a38830222357 Step 4/4 : CMD /bin/bash ---> Running in 6936262fc2fa Removing intermediate container 6936262fc2fa ---> 5a1160571f7e Successfully built 5a1160571f7e Successfully tagged test/mycentos:latest [root@localhost mydocker]docker attach 5a1160571f7e
-
docker容器数据卷继承
docker run -it --name demo1 test/mycentos #运行上面创建镜像,并命名为demo1 docker run -it --name demo2 --volumes demo1 test/mycentos #启动demo2并继承容器数据卷demo1 docker run -it --name demo3 --volumes demo1 test/mycentos #启动demo3并继承容器数据卷demo1 # 在三个容器中分别添加文件,修改文件后 数据都能够被 彼此实时共享 # 即使 domo1 被停掉删除后,对demo2 demo3数据共享也没有影响 # 只要没有死绝就不会有影响
三、dockerFile相关概念
-
执行顺序
-
手动编写一个dockerFile,要符合dockerFile的编写规范
-
有了这个文件后,直接docker build执行文件,获取一个自定义的镜像
-
run
-
-
基础知识
- 每条保留字段指令都必须为大写字母且后面至少要跟一个参数
- 指令从上到下,依次执行
- #表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
-
DockerFile、Docker镜像、Docker容器
DockerFile:DockeFile为了进程准备一切需要的东西,包括文件、环境变量等 Docker镜像:通过docker Build产生一个镜像,当运行该镜像时,才真正开始提供服务【相当于java的类】 Docker容器:容器是直接提供服务的【相当于Java中类的实例】
四、DockerFile保留字指令语义
-
FROM --基础镜像,当前要编写的镜像是基于哪个镜像的
FROM scratch #所有镜像的基础镜像 FROM centos #如果是基于centos做镜像,则FROM centos
-
MAINTAINER --【维修者维护者的意思】镜像维护者
MAINTAINER test<XXXXXXXX@qq.com> #镜像维护者的信息,随便写,或者url地址
-
RUN --容器构建的时候需要运行的命令[例如指定用户]
RUN mkdir -p /test1/test2 #RUN 后面跟linux命令
-
EXPORT --当前容器对外暴露出的端口号
EXPORT 80 #暴漏端口为80
-
WORKDIR --指定在创建容器后,终端默认登录进来的工作目录,一个落脚点
WORKDIR /usr/local #如果使用docker run -it XXX,进入容器后默认所在路径为/usr/local
-
ENV --用来在构建过程中设置环境变量
ENV MY_PATH /usr/local #设置环境变量 WORKDIR $MY_PATH #引用环境变量,默认进入/usr/local
-
ADD – 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
ADD jdk-8u171-linux-x64.tar.gz /usr/local/ #将jdk拷贝进/usr/local/并解压
-
COPY – 拷贝文件到目录镜像中 copy 源文件路径 目标文件路径
COPY c.txt /usr/b.txt #将文件拷贝到容器的/usr下并命名为b.txt
-
VOLUME --容器数据卷,用于数据保存和持久化工作
VOLUME ["/dataVolumecontainer1","/dataVolumeContainer2"] #添加两个容器卷对象,查看宿主机中默认对应的文件路径命令:docker inspect XXXX
-
CMD --指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD命令,但只有最后一个生效,CMD会被docker run的最后一个参数替换
CMD /bin/bash CMD echo "sucess ..... ok " #如果上述两条语句是在同一个dockerFile文件中,只有后面一个CMD命令生效 ----------CMD会被docker run的最后一个参数替换-------------- docker -it -p 8090:8080 tomcat ls -l #就相当于tomcat的dockerFile最后两条语句为: CMD ["catalina.sh",run] CMD ls -l #该命令会生效,CMD ["catalina.sh",run]没有效果,所有docker -it -p 8090:8080 tomcat ls -l 会运行失败
-
ENTRYPOINT – 指定一个容器启动时要运行的命令
跟CMD命令的区别,ENTRYPOINT是追加命令,都会执行
-
ONBUILD --当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发
ONBUILD RUN echo "father onbuild ....." 父镜像test-father的dockerFile文件中的语句 --------------------子镜像中的dockerFile------------------- FROM test-father #子镜像依赖于父镜像test-father ......... #当build 该子镜像时,onbuild被触发
五、dockerFile使用案例
-
运行拉取的centos并进入容器内部,进入的默认工作路径为根目录/,不支持vim a.txt, 不支持ifconfig【解决原有的问题,创建一个新镜像】
[root@localhost mydocker]#vim dockerFile #基于centos做一个新的镜像 FROM centos #声明变量 mypath,值为/usr/local ENV mypath /usr/local #默认进入:/usr/local目录 WORKDIR $mypath #安装VIM RUN yum -y install vim #安装net-tools[ifconfig] RUN yum -y install net-tools #对外暴露端口为80 EXPOSE 80 CMD echo "success --------------- ok" CMD /bin/bash [root@localhost mydocker]# docker build -f /home/mydocker/dockerFile -t mycentos:1.3 . [root@localhost mydocker]# docker run -it a81a5df1118c #进入后默认路径为 /usr/local,可以使用vim,可以使用ipconfig [root@localhost mydocker]# docker history 镜像ID #查看镜像ID的变更历史
-
自定义tomcat9
[root@localhost mydocker]#mkdir -p /zzyyuse/mydockerfile/tomcat9 [root@localhost mydocker]#vim dockerFile FROM centos MAINTAINER test<XXXXXXXX@qq.com> #把宿主机当前上下文的c.txt拷贝到容器/usr/local/路径下 COPY c.txt /usr/local/cincontainer.txt #把java与tomcat添加到容器中 ADD jdk-8u171-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.8.tar.gz /usr/local/ #安装vim编辑器 RUN yum -y install vim #设置工作访问时候的WORKDIR路径,登录落脚点 ENV MYPATH /usr/local WORKDIR $MYPATH #配置java与tomcat环境变量 ENV JAVA_HOME /usr/local/jdk1.8.0_171 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #容器运行时监听的端口 EXPOSE 8080 #启动时运行tomcat # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ] # CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"] CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out [root@localhost mydocker]#docker build -t newtomacat9 . #如果dockerFile是在当前路径下,可以不需要-f 指定路径 [root@localhost mydocker]#docker images #查看newtomcat9是否安装成功 # 运行镜像 [root@localhost mydocker]#docker run -d -p 8090:8080 --name mynewtomcat9 -v /zzyyuse/mydockerfile/tomcat9/webapps/:/usr/local/apache-tomcat-9.0.8/webapps/ -v /zzyyuse/mydockerfile/tomcat9/tomcat9logs/:/usr/local/apache-tomcat-9.0.8/logs/ --privileged=true newtomcat9 # 运行新创建的镜像newtomcat9,并挂载两个容器卷,一个用于发布项目,一个用于查看日志 # 自行写一个简单的html文件,添加到webapps下,通过:localhost:8090/xxx.html访问 # 以及查看日志文件
六、镜像提交到阿里仓库
-
实例列表 -》 点击个人版 -》创建镜像仓库 -》点击创建号的镜仓库详情 -》基本信息 -》操作指南
-
复制将镜像推送到Registry的命令,并执行
$ sudo docker login --username=自己用户名字 registry.cn-hangzhou.aliyuncs.com #需要数据密码 $ sudo docker tag [镜像的ID] registry.cn-hangzhou.aliyuncs.com/XXXX/mycentos:[镜像版本号] $ sudo docker push registry.cn-hangzhou.aliyuncs.com/XXXX/mycentos:[镜像版本号]
-
查看镜像版本是否推送成功
七、docker安装镜像
-
docker安装mysql
[root@localhost ~]# docker pull mysql:5.7 # 运行mysql [root@localhost ~]# docker run -p 3306:3306 --name mysql -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/logs:/logs -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=980621 -d mysql:5.7 #导出所有的数据库到目录/home/mysql/下 [root@localhost ~]# docker exec 2031bedcba56 sh -c 'exec mysqldump --all-databases -uroot -p"980621"' >/home/mysql/all-databses.sql
-
docker安装redis
[root@localhost ~]# docker serarch redis [root@localhost ~]# docker serarch redis:3.2 [root@localhost ~]# docker run -p 6379:6379 -v /home/redis/data:/data -v /home/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes # 连接redis,并进行操作 [root@localhost redis]# docker exec -it 9de95ef6e1fc redis-cli 127.0.0.1:6379> set faf "dfdf" OK 127.0.0.1:6379> get faf "dfdf"