为什么要用Docker
Docker的容器启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
1.更快速的交付和部署
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
2.更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
3.更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
Linux安装Docker
yum install -y epel-releaseyum install docker-io # 安装docker# 配置文件 /etc/sysconfig/dockerchkconfig docker on # 加入开机启动service docker start # 启动docker服务# 基本信息查看docker version # 查看docker的版本号,包括客户端、服务端、依赖的Go等docker info # 查看系统(docker)层面信息,包括管理的images, containers数等docker pull centos 下载docker images [ centos ] 查看docker run -i -t centos /bin/bash镜像的获取与容器的使用
# 搜索镜像docker search <image> # 在docker index中搜索image# 下载镜像docker pull <image> # 从docker registry server 中下拉image# 查看镜像 docker images: # 列出images docker images -a # 列出所有的images(包含历史) docker rmi <image ID>: # 删除一个或多个image# 使用镜像创建容器docker run -i -t sauloal/ubuntu14.04docker run -i -t sauloal/ubuntu14.04 /bin/bash # 创建一个容器,让其中运行 bash 应用,退出后容器关闭docker run -itd --name centos_aways --restart=always centos #创建一个名称centos_aways的容器,自动重启# --restart参数:always始终重启;on-failure退出状态非0时重启;默认为,no不重启# 查看容器 docker ps :列出当前所有正在运行的container docker ps -l :列出最近一次启动的container docker ps -a :列出所有的container(包含历史,即运行过的container) docker ps -q :列出最近一次运行的container ID# 再次启动容器 docker start/stop/restart <container> #:开启/停止/重启container docker start [container_id] #:再次运行某个container (包括历史container)#进入正在运行的docker容器 docker exec -it [container_id] /bin/bash docker run -i -t -p <host_port:contain_port> #:映射 HOST 端口到容器,方便外部访问容器内服务,host_port 可以省略,省略表示把 container_port 映射到一个动态端口。# 删除容器 docker rm <container...> #:删除一个或多个container docker rm `docker ps -a -q` #:删除所有的container docker ps -a -q | xargs docker rm #:同上, 删除所有的containerwindow安装Docker
访问https://id.docker.com/login/?next=%2Fid%2Foauth%2Fauthorize%2F%3Fclient_id%3D43f17c5f-9ba4-4f13-853d-9d0074e349a7%26next%3D%252F%253Foverlay%253Donboarding%26nonce%3DeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiI0M2YxN2M1Zi05YmE0LTRmMTMtODUzZC05ZDAwNzRlMzQ5YTciLCJleHAiOiIyMDIxLTA1LTMwVDAzOjIxOjU3LjEyOTY0ODg0WiIsImlhdCI6IjIwMjEtMDUtMzBUMDM6MTY6NTcuMTI5NjQ5MzJaIiwicmZwIjoiRmJ0b0ZtQkVuaUJjXzBIMHAtUHZ0UT09IiwidGFyZ2V0X2xpbmtfdXJpIjoiLz9vdmVybGF5PW9uYm9hcmRpbmcifQ.GSxQrb_Z0WWJxdWqvwaglA5SWPdNWgzv98mzc67jKGA%26redirect_uri%3Dhttps%253A%252F%252Fhub.docker.com%252Fsso%252Fcallback%26ref%3Dlogin%26response_type%3Dcode%26scope%3Dopenid%26state%3DeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiI0M2YxN2M1Zi05YmE0LTRmMTMtODUzZC05ZDAwNzRlMzQ5YTciLCJleHAiOiIyMDIxLTA1LTMwVDAzOjIxOjU3LjEyOTY0ODg0WiIsImlhdCI6IjIwMjEtMDUtMzBUMDM6MTY6NTcuMTI5NjQ5MzJaIiwicmZwIjoiRmJ0b0ZtQkVuaUJjXzBIMHAtUHZ0UT09IiwidGFyZ2V0X2xpbmtfdXJpIjoiLz9vdmVybGF5PW9uYm9hcmRpbmcifQ.GSxQrb_Z0WWJxdWqvwaglA5SWPdNWgzv98mzc67jKGA下载安装
安装之后检测是否安装成功
docker run hello-world
Docker的基本原理
Docker利用Linux中的核心分离机制,例如Cgroups,以及Linux的核心Namespace(名字空间)来创建独立的容器。一句话概括起来Docker就是利用Namespace做资源隔离,用Cgroup做资源限制,利用Union FS做容器文件系统的轻量级虚拟化技术。Docker容器的本质还是一个直接运行在宿主机上面的特殊进程,看到的文件系统是隔离后的,但是操作系统内核是共享宿主机OS,所以说Docker是轻量级的虚拟化技术。
Docker容器常用命令
#启动新容器的命令。该命令的最简形式接收镜像和命令作为参数。镜像用于创建容器,而命令则是希望容器运行的应用。docker container run#用于列出所有在运行(UP)状态的容器。如果使用 -a 标记,还可以看到处于停止(Exited)状态的容器docker container ls#用于在运行状态的容器中,启动一个新进程。该命令在将 Docker 主机 Shell 连接到一个运行中容器终端时非常有用。docker container exec#此命令会停止运行中的容器,并将状态置为 Exited(0)。docker container stop#重启处于停止(Exited)状态的容器。可以在 docker container start 命令中指定容器的名称或者 ID。docker container start#删除停止运行的容器。可以通过容器名称或者 ID 来指定要删除的容器。推荐首先使用 docker container stop 命令停止容器,然后使用 docker container rm 来完成删除。docker container rm#显示容器的配置细节和运行时信息。该命令接收容器名称和容器 ID 作为主要参数。docker container inspectDocker镜像的常用命令
#载镜像的命令。镜像从远程镜像仓库服务的仓库中下载。docker image pull#列出了本地 Docker 主机上存储的镜像。docker image ls#从 Docker Hub 的 alpine 仓库中拉取标签为 latest 的镜像。docker image pull alpine:latest#是删除 alpine:latest 镜像。docker image rm#该命令完美展示了镜像的细节,包括镜像层数据和元数据。docker image inspectDockerFile介绍
使用docker image build命令会读取 Dockerfile,并将应用程序容器化。Dockerfile 由一行行命令语句组成,并支持以 # 开头的注释行。如
# Test web-app to use with Pluralsight courses and Docker Deep Dive book# Linux x64FROM alpineLABEL maintainer="nigelpoulton@hotmail.com"# Install Node and NPMRUN apk add --update nodejs nodejs-npm# Copy app to /srcCOPY . /srcWORKDIR /src# Install dependenciesRUN npm installEXPOSE 8080ENTRYPOINT ["node", "./app.js"]1.FROM 指令用于指定要构建的镜像的基础镜像。它通常是 Dockerfile 中的第一条指令。
2.RUN 指令用于在镜像中执行命令,这会创建新的镜像层。每个 RUN 指令创建一个新的镜像层。
3.COPY 指令用于将文件作为一个新的层添加到镜像中。通常使用 COPY 指令将应用代码赋值到镜像中。
4.EXPOSE 指令用于记录应用所使用的网络端口。
5.ENTRYPOINT 指令用于指定镜像以容器方式启动后默认运行的程序。
DockerFile制作tomcat镜像
[root@docker-server ~]# mkdir tomcat [root@docker-server ~]# cd tomcat/[root@docker-server tomcat]# vim Dockerfile#This my first jenkins Dockerfile#Version 1.0FROM daocloud.io/library/centos:7MAINTAINER docker-serverENV JAVA_HOME /usr/local/jdk1.8.0_211ENV TOMCAT_HOME /usr/local/apache-tomcat-8.5.45ENV PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHENV CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jarADD apache-tomcat-8.5.45.tar.gz /usr/local/ADD jdk-8u211-linux-x64.tar.gz /usr/local/RUN rm -rf /usr/local/apache-tomcat-8.5.45/webapps/*ADD jenkins.war /usr/local/apache-tomcat-8.5.45/webappsRUN rm -rf apache-tomcat-8.5.45.tar.gz apache-tomcat-8.5.45.tar.gzitdEXPOSE 8080ENTRYPOINT ["/usr/local/apache-tomcat-8.5.45/bin/catalina.sh","run"] #运行命令bn[root@docker-server tomcat]# pwd/root/tomcat[root@docker-server tomcat]# ls #将jdk与tomcat还有jenkins的包上传到tomcat目录中apache-tomcat-8.5.47.tar.gz Dockerfile jdk-8u211-linux-x64.tar.gz jenkins.war[root@docker-server tomcat]# docker build -t jenkins:v1 .[root@docker-server tomcat]# docker run -itd --name jenkins1 -p 8081:8080 jenkins:v1上传镜像到dockerhub
1.先申请Docker hub 帐号 ,并创建仓库
首先申请一个docker hub 帐号,登录到dockehub点击一下按钮:create —> create repository ,取个名字,这里我们最终创建的仓库名称:lidnyun/kube-apiserver-amd64 ,这个lidnyun是帐号,kube-apiserver-amd64是其中一个仓库名。
2.为镜像打标签
docker tag gcr.io/google_containers/kube-apiserver-amd64:v1.5.5 lidnyun/kube-apiserver-amd64:v1.5.5lidnyun是步骤一提到的账户名kube-apiserver-amd64是步骤一提到的仓库名称v1.5.5是tag版本。3.push镜像
root@master:~# docker push lidnyun/kube-apiserver-amd64:v1.5.5The push refers to a repository [docker.io/lidnyun/kube-apiserver-amd64]48ca1ee39728: Pushing [==> ] 6.097 MB/124.8 MBc0de73ac9968: Pushing [==================================================>] 1.312 MBv1.5.5: digest: sha256:7dd91e4670b3563de04fee77c3206d84ca556ea88f95a40ee510ca2b77dc49d7 size: 739SpringBoot微服务打包成docker镜像并发布
1.打包项目jar
2.编写dockerfile文件
FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8000"] EXPOSE 8000 ENTRYPOINT ["java","-jar","/app.jar"]3.构建镜像
上传jar包和Dockerfile到服务器的一个文件夹(没有先建立一个即可,可以使用mkdir或者直接用xftp直接像Windows那样创建方式)先放着,如图:
[root@localhost /]# cd /home/ideadocker[root@localhost ideadocker]# ls[root@localhost ideadocker]# docker build -t firstimages .4.发布运行
[root@localhost ideadocker]# docker run -d -p 8000:8000 --name firstweb firstimages