Docker学习笔记
docker 虚拟机配置网络 可以使用dhclient工具为虚拟机分配一个可用的ip
1 2 3 4 5 6 7 8 9 10 11 12 # 分配ip地址 dhclient # 修改网络配置 vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTO="static" ONBOOT="yes" # 添加如下配置 IPADDR=192.168.31.17 #注意这是分配的IP GATEWAY=192.168.31.1 DNS1=119.29.29.29
一.修改网络配置:
vi /etc/sysconfig/network-scripts/ifcfg-ens33
2.输入i进入编辑模式,将最后一行的ONBOOT=no改为ONBOOT=yes
按Esc键,输入“:wq!”,保存并退出
然后重启网络,输入service network restart
输入ip addr查看ip
Docker的历史 有意思的是,Docker 公司起初是一家名为 dotCloud 的平台即服务(Platform-as-a-Service, PaaS)提供商。
底层技术上,dotCloud 平台利用了 Linux 容器技术。为了方便创建和管理这些容器,dotCloud 开发了一套内部工具,之后被命名为“Docker”。Docker就是这样诞生的!
2013年,dotCloud 的 PaaS 业务并不景气,公司需要寻求新的突破。于是他们聘请了 Ben Golub 作为新的 CEO,将公司重命名为“Docker”,放弃dotCloud PaaS 平台,怀揣着“将 Docker 和容器技术推向全世界”的使命,开启了一段新的征程。
如今 Docker 公司被普遍认为是一家创新型科技公司,据说其市场价值约为 10 亿美元。Docker 公司已经通过多轮融资,吸纳了来自硅谷的几家风投公司的累计超过 2.4 亿美元的投资。
几乎所有的融资都发生在公司更名为“Docker”之后。
提示:“Docker”一词来自英国口语,意为码头工人(Dock Worker),即从船上装卸货物的人。
Docker能干嘛
之前的虚拟机技术
虚拟机缺点
容器化技术
容器化技术并不是一个完整的技术
一个容器包含了运行环境和应用,每个容器时互相隔离的,容器直接运行在操作系统之上,从分利用操作系统的资源。
Docker 是一个开源的应用容器引擎,基于Go语言并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
比较Docker和虚拟机不同:
传统虚拟机,虚拟出一个硬件,运行一个完整的操作系统,在这个系统上安装和操作软件。
容器内的应用直接运行在宿主机的内容,容器是没有内核的,也没有虚拟我们的硬件,所以是非常轻便的。
没有容器间是相互隔离的,每个容器都有属于自己的文件系统,互不影响。
DevOps(开发、运维)
更快速的交付和部署。
更便捷的升级和扩缩容 。
更简单的系统运维。
更高效的计算机资源利用 (Docker是内核级别的虚拟化)
Docker的基本组成
镜像(image) 镜像就是一个只读的模板,镜像可以用来创建Docker容器,一个镜像可以创建很多容器
容器(container) Docker利用容器独立运行的一个或一组应用。容器是用镜像创建的运行实例。
它可以被启用,开始,停止,删除。每个容器都是相互隔离的,保证安全的平台。
可以把容器看作是一个简易版的Linux环境 (包括root用户权限,进程空间,用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎一摸一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的
仓库(repository) 仓库是集中存放镜像文件的场所。
仓库和仓库注册服务器(Registry)是有区别的,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签
仓库分为公开仓库(public)和私有仓库(private)两种形式
最大的开放仓库是Docker Hub: https://hub.docker.com/ 存放了数量庞大的镜像供用户下载。
国内的公开仓库包括阿里云,网易云等
安装Docker 查看系统内核
1 2 [root@MiWiFi-R4A-srv /]# uname -r 3.10.0-1062.el7.x86_64
查看系统版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@MiWiFi-R4A-srv /]# cat /etc/os-release NAME="CentOS Linux" VERSION="7 (Core)" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="7" PRETTY_NAME="CentOS Linux 7 (Core)" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:7" HOME_URL="https://www.centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-7" CENTOS_MANTISBT_PROJECT_VERSION="7" REDHAT_SUPPORT_PRODUCT="centos" REDHAT_SUPPORT_PRODUCT_VERSION="7"
卸载旧的版本
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 # 卸载旧版本 $ 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 # 更新yum软件包索引 yum makecache fast # 安装docker相关 docker-ce社区版 ee版企业版 sudo yum install docker-ce docker-ce-cli containerd.io # 启动docker sudo systemctl start docker # 使用docker -version查看是否安装成功 docker -version # hello world程序 docker run hello-world # 查看镜像 [root@MiWiFi-R4A-srv ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat latest 6d15a1d68603 7 days ago 649MB mysql 8.0.22 ab2f358b8612 8 days ago 545MB mysql latest ab2f358b8612 8 days ago 545MB redis latest ef47f3b6dc11 8 days ago 104MB centos centos7 8652b9f0cb4c 5 weeks ago 204MB hello-world latest bf756fb1ae65 11 months ago 13.3kB
卸载Docker
1 2 3 4 5 # 卸载依赖 $ sudo yum remove docker-ce docker-ce-cli containerd.io # 删除资源 $ sudo rm -rf /var/lib/docker
阿里云镜像加速
1 2 3 4 5 6 7 8 9 10 11 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://n1p195zp.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
底层原理 Docker是怎么工作的?
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。
DockerServer接收到Docker-Client的指令,就会执行这个命令。
为什么Docker比VM快?
Docker有着虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在CPU、内存利用率上Docker将会有明显优势。
Docker利用的是宿主机的内核,而不需要GuestOS,因此,当新建一个容器时Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载GuestOS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker只需几秒钟。
Docker容器
虚拟机(VM)
操作系统
与宿主机共享OS
宿主机OS上运行宿主机OS
存储大小
镜像小,便于存储与传输
镜像庞大(vmdk等)
运行性能
几乎无额外性能损失
操作系统额外的cpu、内存消耗
移植性
轻便、灵活、适用于Linux
笨重、与虚拟化技术耦合度高
硬件亲和性
面向软件开发者
面向硬件运维者
Docker的常用命令 帮助命令 1 2 3 docker --version # 显示Docker的版本信息 docker info # 显示Docker的系统信息,包括镜像和容器的数量 docker --help # 帮助命令
镜像命令 1 2 3 docker images # 查看本地所有镜像 docker images -a # 列出本地所有的镜像(含中间映像层) docker images -q # 只显示id
1 2 docker search mysql # 搜索镜像 docker search mysql --filter=STARS=3000 # 过滤只搜索3000satr以上的
1 2 docker pull mysql # 如果不写tag,默认latest最新版 docker pull mysql:5.7 # 指定版本下载
1 docker rmi 697daaecf703 # Docker删除镜像
容器命令 有镜像才能创建容器,下载一个centos镜像来学习。
新建容器并启动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 docker run [可选参数] image # 参数说明 --name="NAME" 容器名字,用来区别容器 -d 后台方式运行 -it 使用交互方式运行,进入容器查看内容 -p -p 8080:8080 -p 主机端口:容器端口(常用) -p 容器端口 容器端口 -P 随机指定端口 # 测试 docker run -it centos /bin/bash # 从容器退回主机 exit
列出所有正在运行的容器
1 2 3 4 5 6 7 8 9 10 [root@MiWiFi-R4A-srv /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 581a17d041b4 centos "/bin/bash" 3 minutes ago Up 3 minutes nice_roentgen docker ps -a # 列出所有容器 docker ps -a -n=1 # 显示最近创建的容器 docker ps -aq # 显示当前容器的编号
退出容器
1 2 exit # 直接容器停止并退出 Ctrl + P + Q # 容器不停止退出
删除容器
1 2 docker rm 容器id # 删除指定的容器,不能删除正在运行的容器 docker rm -f $(docker ps -ap) # 删除所有的容器
启动和停止容器操作
1 2 3 4 docker start容器id # 启动容器 docker restart 容器id # 重启容器 docker stop 容器id # 停止容器 docker kill 容器id #强制停止当前容器
常用其他命令 后台启动容器
1 2 3 docker run -d centos # docker ps发现centos停止了 # 常见的坑,dokcer容器使用后台运行,就必须要有一个前台进程,docker发现没有应用,就会自动停止
查看日志
1 docker logs -f -t --tail 容器id
查看容器中进程信息
1 2 3 [root@MiWiFi-R4A-srv ~]# docker top 847858ee8a4a UID PID PPID C STIME TTY TIME CMD root 5967 5947 0 22:28 ? 00:00:00 /bin/bash
查看镜像的元数据
1 docker inspect 847858ee8a4a
进入当前正在运行的容器 1 2 3 4 5 # 方式一 开启一个新的终端 docker exec -it 847858ee8a4a /bin/bash # 方式二 执行正在运行的终端 docker attach 847858ee8a4a #正在执行当前的代码
从容器内部拷贝文件到主机上 1 2 3 4 docker cp 容器id:容器内路径 目的主机路径 # 将dockers内部/home下的zhang.java拷贝到主机的home docker cp dc6084befe30:/home/zhang.java /home
练习
Docker安装nginx
1 2 3 4 5 6 # 搜索镜像 docker search nginx # 下载镜像 docker pull nginx # 运行镜像 -d后台运行 --name给容器命名 -p宿主机端口 docker run -d --name nginx01 -p 3344:80 nginx
Docker安装tomcat
1 2 # 官方的使用(-rm 用完及删除,用于测试) docker run --rm tomcat:9.0
可视化
docker图形化管理工具
安装
1 2 docker run -d -p 8088:9000 \ --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer
访问测试
Docker镜像 镜像是什么 镜像是一个轻量级、可执行的的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需要的内容,包括代码,运行时库,环境变量和配置文件。
如何得到镜像呢?
Docker镜像加载原理
UnionFS(联合文件系统)
Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统时Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像的加载原理
docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs (boot file system) 主要包含bootloader和kernel,bootloader 主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就存在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
roorfs (root file system),在bootfs之上。包含的就是典型Linux系统中的 /dev ,/proc,/bin ,/etx 等标准的目录和文件。rootfs就是各种不同的操作系统发行版。比如Ubuntu,Centos等等。
对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host(宿主机)的kernel,自己只需要提供rootfs就行了,由此可见对于不同的Linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加到镜像的顶部。这一层就是我们通常说的容器层,容器之下都叫镜像层。
Commit镜像 1 2 3 docker commit # 提交容器成为一个新的版本 docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[tag]
实战测试
1 2 3 4 5 6 7 8 9 10 11 12 # 启动一个默认的tomcat docker run -it -p 9999:9999 tomcat # 发现这个tomcat,webapps下面时没有文件的 root@24cc7cd482ff:/usr/local/tomcat# cd webapps root@24cc7cd482ff:/usr/local/tomcat/webapps# ls # 自己拷贝进去基本的文件 root@24cc7cd482ff:/usr/local/tomcat# cp -r webapps.dist/* webapps # 生成一个新镜像 docker commit -a="zhang" -m="add webapps app" 24cc7cd482ff tomcat02:1.0
这就是我们修改过的镜像
安装MySQL mysql数据的持久化问题
1 2 3 4 5 6 7 8 9 [root@izbp13r5pmefkwfqgkx4i2z ~]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql e1911d0e9045f63df828e4639196ce32e1bf631e21df3c7fb789c487055d572b # 启动mysql -d 后台运行 -p 端口映射 -v 卷挂载 -e 环境配置 密码 --name 容器名称
测试连接
进入host的home目录,发现mysql目录,进入data目录可以看到数据。
我们利用本地navicat新建一个数据库,再次查看data目录下文件
发现多了test文件,说明映射的路径是ok的。
假设我们删除容器
发现数据并没消失
Dockerfile dockerfile就是用来构建docker镜像的构建文件(命令脚本,通过这个脚本可以生成镜像)
1 2 3 4 5 # 创建一个dockerfile文件 FROM centos VOLUME ["volume01","volume02"] CMD echo "------end--------" CMD /bin/bash
1 docker build -f /home/docker-test-voume/dockerfile01 -t zhangdemo/centos:1.o .
启动自己的镜像
构建步骤
编写一个dokerfile文件
docker build构建一个镜像
docker run 运行镜像
docker push 发布镜像
基础知识
每个关键字都是大写
执行从上到下的顺序
# 表示注释
每一个指令都会创建提交一个新的镜像层,并提交
dockerfile是面向开发。Docker逐渐成为了企业交付的标准。
DockerFile的指令 1 2 3 4 5 6 7 8 9 10 11 12 FROM # 基础镜像,一切从这里开始构建 MAINTAINER # 镜像是谁写的,姓名+邮箱 RUN # 镜像构建的时候需要运行的命令 ADD # 步骤,tomcat镜像,这个tomcat的压缩包!添加内容 WORKDIR # 镜像的工作目录 VOLUME # 挂载的目录位置 EXPOST # 暴露端口 CMD # 指定容器启动时要输出的命令,只有最后一个会生效,可被替代 ENTRYPOINT # 指定容器启动时要输出的命令,可以追加命令 ONBUILD # 当构建一个被继承DockerFile这个时候就会运行ONBUILD指令,触发指令。 COPY # 类似ADD命令,将文件拷贝到镜像中 ENV # 构建的时候设置环境变量
构建自己的Centos 1.编写dockerfile的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 # 基于Centos FROM centos # 告诉别人我是谁 MAINTAINER zhang<495726603@qq.com> # 环境变量 ENV MYPATH /usr/local # 工作目录 WORKDIR $MYPATH # 安装一个vim RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "-----end-------" CMD /bin/bash
2.通过文件构建镜像
1 2 3 4 docker build -f mydockerfile -t mycentos:v1 . # -f 代表dockerfile的文件路径 # -t 镜像名和版本号
3.测试运行
可以看到运行的工作目录为我们在dockerfile中配置的工作目录,
并且ifconfig命令可用了.
4.可以通过docker history 镜像id列出本地镜像的变更地址
CMD和ENTRYPOINT的区别
测试cmd
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 26 27 28 # 编写dockerfile文件 vim dockerfile-cmd-test FROM centos CMD ["ls","-a"] # 构建镜像 docker build -f dockerfile-cmd-test -t cmdtest . # run运行,发现我们的ls -a命令生效 [root@izbp13r5pmefkwfqgkx4i2z dockerfile]# docker run bef2698bd130 . .. .dockerenv bin dev etc home lib lib64 lost+found media # 想追加一个命令 -l ls -al [root@izbp13r5pmefkwfqgkx4i2z ~]# docker run bef2698bd130 -l docker: Error response from daemon: OCI runtime create failed: container_linux.go:370: starting container process caused: exec: "-l": executable file not found in $PATH: unknown. # cmd的情况下 -l替换了CMD["ls" ,"-a" ]命令 ,不是命令所以报错
测试entryporint(我们追加的命令,是直接在我们的entrypoint命令后面的)
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 [root@izbp13r5pmefkwfqgkx4i2z ~]# vim dockerfile-cmd-entrypoint [root@izbp13r5pmefkwfqgkx4i2z ~]# docker build -f dockerfile-cmd-entrypoint -t entorypoint-test . Sending build context to Docker daemon 726kB Step 1/2 : FROM centos ---> 300e315adb2f Step 2/2 : ENTRYPOINT ["ls","-a"] ---> Running in 51ffcc67a242 Removing intermediate container 51ffcc67a242 ---> 4645e2e60db1 Successfully built 4645e2e60db1 Successfully tagged entorypoint-test:latest [root@izbp13r5pmefkwfqgkx4i2z ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE entorypoint-test latest 4645e2e60db1 15 seconds ago 209MB cmdtest latest bef2698bd130 14 minutes ago 209MB mycentos v1 ee0d621d29ee 2 hours ago 282MB zhangdemo/centos 1.o 8bb60281dfef 4 hours ago 209MB mysql latest a347a5928046 4 days ago 545MB tomcat latest feba8d001e3f 8 days ago 649MB redis latest ef47f3b6dc11 2 weeks ago 104MB centos latest 300e315adb2f 2 weeks ago 209MB portainer/portainer latest 62771b0b9b09 5 months ago 79.1MB hello-world latest bf756fb1ae65 11 months ago 13.3kB [root@izbp13r5pmefkwfqgkx4i2z ~]# docker run 4645e2e60db1 . .. .dockerenv bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@izbp13r5pmefkwfqgkx4i2z ~]# docker run 4645e2e60db1 -l total 56 drwxr-xr-x 1 root root 4096 Dec 26 13:15 . drwxr-xr-x 1 root root 4096 Dec 26 13:15 .. -rwxr-xr-x 1 root root 0 Dec 26 13:15 .dockerenv lrwxrwxrwx 1 root root 7 Nov 3 15:22 bin -> usr/bin drwxr-xr-x 5 root root 340 Dec 26 13:15 dev drwxr-xr-x 1 root root 4096 Dec 26 13:15 etc drwxr-xr-x 2 root root 4096 Nov 3 15:22 home lrwxrwxrwx 1 root root 7 Nov 3 15:22 lib -> usr/lib lrwxrwxrwx 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64 drwx------ 2 root root 4096 Dec 4 17:37 lost+found drwxr-xr-x 2 root root 4096 Nov 3 15:22 media drwxr-xr-x 2 root root 4096 Nov 3 15:22 mnt drwxr-xr-x 2 root root 4096 Nov 3 15:22 opt dr-xr-xr-x 90 root root 0 Dec 26 13:15 proc dr-xr-x--- 2 root root 4096 Dec 4 17:37 root drwxr-xr-x 11 root root 4096 Dec 4 17:37 run lrwxrwxrwx 1 root root 8 Nov 3 15:22 sbin -> usr/sbin drwxr-xr-x 2 root root 4096 Nov 3 15:22 srv dr-xr-xr-x 13 root root 0 Dec 26 13:15 sys drwxrwxrwt 7 root root 4096 Dec 4 17:37 tmp drwxr-xr-x 12 root root 4096 Dec 4 17:37 usr drwxr-xr-x 20 root root 4096 Dec 4 17:37 var
实战:Tomcat镜像 1.准备镜像文件,tomcat压缩包,tomcat依赖java,需要jdk
2.编写dockekfile文件。官方命名Dockerfile,使用这个就不需要加-f指定文件名
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 26 27 28 29 30 31 32 33 34 35 36 37 38 # 基础镜像 FROM centos MAINTAINER zhangliyuan<495726603@qq.com> COPY readme.txt /tomcat/readme.txt # 用add命令会自动帮我们解压 ADD jdk-11.0.8_linux-x64_bin.tar.gz /usr/local/ ADD apache-tomcat-9.0.41.tar.gz /usr/local/ # 安装vim RUN yum -y install vim # 环境变量 ENV MYPATH /usr/local # 工作目录 WORKDIR $MYPATH # java环境变量 ENV JAVA_HOME /usr/loacl/jdk11.0.8 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar # 配置tomcat环境变量 ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.41 ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.41 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin # 暴露端口 EXPOSE 8080 # tomcat日志 CMD /usr/local/apache-tomcat-9.0.41/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.41/bin/logs/catalina.out
3.构建镜像
1 docker build -t diytomcat .
发布自己的镜像 DockerHub 登录dockerhub
login -u zhangliyuandocker``` 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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 增加一个tag `docker tag a6c12980154f zhangliyuan/tomcat:1.0 ` 提交 `docker push zhangliyuan/tomcat:1.0 `  - 找到镜像容器服务 - 创建命名空间 - 创建容器镜像  - 在idea中新建Dockerfile文件 ```shell FROM java:8 WORKDIR /app COPY upload.jar . CMD ["--server.port=8080" ] EXPOSE 8080 ENTRYPOINT java -jar upload.jar
将Dockerfile和jar包用xftp上传到服务器
docker build -t zhangupload .
docker run -d -P --name upload zhangupload
sudo docker logs -f -t --tail 行数 容器名