希望长大对我而言,是可以做更多想做的事,而不是被迫做更多不想做的事...... 首页 docker 丁D 学无止境 2019-04-23 17:21 3932已阅读 docker 摘要Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 # docker ###使用docker优点? 1.打包应用 到容器中 2.隔离 3.启动快 ###什么是docker? **Docker 镜像**(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。 **仓库**(Repository)是集中存放镜像文件的场所,**docker hub**。 Docker 利用**容器**(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。 ![alt](/upload/architecture.jpg ) ###安装docker https://docs.docker.com/install/linux/docker-ce/centos/ ###常用命令 ```js //查看镜像 docker images //查询centos镜像 docker search centos //拉取tag为6.8的centos docker pull centos:6.8 //运行容器,并登录终端 docker run -it centos:6.8 /bin/bash docker run -d xujd_v2/blog_image /bin/bash -c "while true; do echo hello world; sleep 1; done" //停止一个正在运行的容器 docker stop c1e43f1b4c40 //启动一个容器,之前使用过docker run运行过的 docker start //docker run 和 docker start区别 docker run只在第一次运行时使用,将镜像放到容器中,以后再次启动这个容器时,只需要使用命令docker start 即可 // 进入一个已经在运行的容器 sudo docker exec -it c1e43f1b4c40 /bin/bash //查看正在运行的容器 docker ps //查看所有的容器 docker ps -a //删除容器,必须要先stop docker rm //删除镜像,必须先删除容器, docker rmi xxxx //提供用户交互的输入 -i //进入镜像终端 -t //后台运行 -d //映射端口 -p ``` ```js //查看docker容器详情 docker inspect c13c4f513eab [ { "Id": "c13c4f513eab415ad355ba7607392a84d69cb0ba0018739cf3e040780a148d4e", "Created": "2019-04-23T02:34:15.419464005Z", "Path": "/bin/bash", "Args": [], "State": { "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 28969, "ExitCode": 0, "Error": "", "StartedAt": "2019-04-23T03:13:29.799806806Z", "FinishedAt": "2019-04-23T02:36:17.837234697Z" }, "Image": "efa3cf7ee1f93d75578007edf881ddc2cc048e9da03503f103c819b157f94b75", "NetworkSettings": { "Bridge": "", "EndpointID": "49c648da46dcc4e2f794fc146cfb969fa4cdf89c1d159534cd8a701cf9f9a811", "Gateway": "172.17.42.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "HairpinMode": false, "IPAddress": "172.17.0.19", "IPPrefixLen": 16, "IPv6Gateway": "", "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:13", "NetworkID": "1d5d60cb383beaed8c57ba5edc08129e82b78cf2cdb95e9b8bdfe49c4f923d0e", "PortMapping": null, "Ports": {}, "SandboxKey": "/var/run/docker/netns/c13c4f513eab", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null }, "ResolvConfPath": "/var/lib/docker/containers/c13c4f513eab415ad355ba7607392a84d69cb0ba0018739cf3e040780a148d4e/resolv.conf", "HostnamePath": "/var/lib/docker/containers/c13c4f513eab415ad355ba7607392a84d69cb0ba0018739cf3e040780a148d4e/hostname", "HostsPath": "/var/lib/docker/containers/c13c4f513eab415ad355ba7607392a84d69cb0ba0018739cf3e040780a148d4e/hosts", "LogPath": "/var/lib/docker/containers/c13c4f513eab415ad355ba7607392a84d69cb0ba0018739cf3e040780a148d4e/c13c4f513eab415ad355ba7607392a84d69cb0ba0018739cf3e040780a148d4e-json.log", "Name": "/naughty_lalande", "RestartCount": 0, "Driver": "devicemapper", "ExecDriver": "native-0.2", "MountLabel": "", "ProcessLabel": "", "Volumes": {}, "VolumesRW": {}, "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LxcConf": [], "Memory": 0, "MemorySwap": 0, "CpuShares": 0, "CpuPeriod": 0, "CpusetCpus": "", "CpusetMems": "", "CpuQuota": 0, "BlkioWeight": 0, "OomKillDisable": false, "Privileged": false, "PortBindings": {}, "Links": null, "PublishAllPorts": false, "Dns": null, "DnsSearch": null, "ExtraHosts": null, "VolumesFrom": null, "Devices": [], "NetworkMode": "bridge", "IpcMode": "", "PidMode": "", "UTSMode": "", "CapAdd": null, "CapDrop": null, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "SecurityOpt": null, "ReadonlyRootfs": false, "Ulimits": null, "LogConfig": { "Type": "json-file", "Config": {} }, "CgroupParent": "" }, "Config": { "Hostname": "c13c4f513eab", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "PortSpecs": null, "ExposedPorts": null, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "centos:6.8", "Volumes": null, "VolumeDriver": "", "WorkingDir": "", "Entrypoint": null, "NetworkDisabled": false, "MacAddress": "", "OnBuild": null, "Labels": { "build-date": "2016-06-02", "license": "GPLv2", "name": "CentOS Base Image", "vendor": "CentOS" } } } ] ``` ###创建镜像2种方式 1.使用已经存在的镜像,并**更新提交**形成新的镜像 2.使用 **Dockerfile**来指定创建新的镜像 ```js //方式1 //更新镜像并提交成新的镜像 //-m:提交的描述信息 -a:指定镜像作者 //e218edb10161 镜像id docker commit -m="has update" -a="runoob" //方式2 //创建镜像 -t :指定要创建的目标镜像名 docker build -t runoob/centos:6.7 . //设置镜像tag docker tag 860c279d2fec runoob/centos:dev ``` **创建java环境镜像** 1.使用centos6.8做基础镜像 2.安装jdk 3.安装tomcat 4.配置环境变量并暴露端口 **步骤** 1.创建一个文件夹。 ```js mkdir docker ``` 2.将apache-tomcat-8.5.40.tar.gz jdk-8u144-linux-x64.tar.gz 复制到docker文件夹中 **Dockerfile的文件中的相对路径是Dockerfile所在的目录** ```js cp /usr/local/apache-tomcat-8.5.40.tar.gz ~/docker cp /usr/local/jdk-8u144-linux-x64.tar.gz ~/docker ``` **3.创建并编写Dockerfile文件** ```js FROM centos:6.8 MAINTAINER xujd ADD jdk-8u144-linux-x64.tar.gz /usr/local ADD apache-tomcat-8.5.40.tar.gz /usr/local ENV JAVA_HOME=/usr/local/jdk1.8.0_144 ENV PATH=$JAVA_HOME/bin:$PATH ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar EXPOSE 8080 ``` ```js FROM centos:6.8 MAINTAINER xujd ADD jdk-8u144-linux-x64.tar.gz /usr/local ADD apache-tomcat-8.5.40 /usr/local/apache-tomcat-8.5.40 ENV JAVA_HOME=/usr/local/jdk1.8.0_144 ENV PATH=$JAVA_HOME/bin:$PATH ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV APP_ENCRYPTION_PASSWORD=123456 EXPOSE 8080 CMD ["/usr/local/apache-tomcat-8.5.40/bin/catalina.sh", "run"] 这个跟上面那个的区别是 上面的tomcat是tar ADD命令会自动解压,,没有war 到时候在使用挂载方式 下面 ADD apache-tomcat-8.5.40 /usr/local/apache-tomcat-8.5.40 apache-tomcat-8.5.40是一个目录不是tar.. 已经将要部署的war解压(jar xvf blog.war)放入tomcat的webapp目录中了 下面是自己手动解压(jar xvf blog.war)后的。。目标目录要自己创建(/usr/local/apache-tomcat-8.5.40) 不然会将源目录下面的文件 复制到/usr/local/下面而不是 /usr/local/apache-tomcat-8.5.40 ``` **4.构建** 使用-t指定镜像名 .当前目录是docker目录 ```js docker build -t xujd/blog_image . //查看镜像 docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE xujd/blog_image latest 62ff846ee49c 2 hours ago 584.6 MB ``` ![alt](http://54288.top/upload/20190423140519.png ) **5.运行容器** ```js //第一个8080是本地的 第二个8080是docker -d后台运行 //catalina.sh run 启动容器的时候也启动tomcat //可以在Dockerfile使用**CMD**命令来控制运行容器就启动tomcat就不要catalina.sh run docker run -d -p 8081:8080 xujd/blog_image /usr/local/apache-tomcat-8.5.40/bin/catalina.sh run ``` ![alt](http://54288.top/upload/20190423140508.png ) ###运行一个war包 ```js //war是本博客的 //--env配置环境变量,因为配置文件密码加密 //-v将宿主机~/webapps/挂载docker中tomcat的webapps docker run --env APP_ENCRYPTION_PASSWORD=123456 -d -p 8080:8080 -v ~/webapps/:/usr/local/apache-tomcat-8.5.40/webapps/ xujd/blog_image /usr/local/apache-tomcat-8.5.40/bin/catalina.sh run ``` **注意1**: 博客要连接数据库,数据库在宿主机上,所以docker需要连接外部数据库 docker数据库连接不能用127.0.0.1了要换成宿主机的ip(docker虚拟出来的网卡) 查看宿主机的ip docker0 ```js //ifconfig docker0 Link encap:Ethernet HWaddr 3E:AF:01:F7:09:61 inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8749 errors:0 dropped:0 overruns:0 frame:0 TX packets:22844 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1820508 (1.7 MiB) TX bytes:32405691 (30.9 MiB) ``` **注意2:** 数据库默认只能127.0.0.1才能访问所以要设置能其他ip访问 ```js GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; flush privileges; ``` **问题:** ```js 由于我重启了防火墙,但是没有重启docker,启动容器报错!! docker0: iptables: No chain/target/match by that name 解决方案:重启docker: service restart docker ``` ```js 登录docker容器内部在/etc/profile,source /etc/profile配置环境变量不生效 解决方案: 1.Dockerfile配置文件使用env来配置 推荐 2.运行容器的时候使用--env来指定。上面就是这个做的/root/.bashrc 3.登录容器中配置在/root/.bashrc文件中(没试过) ``` ```js docker pull 54288.top:5000/registry:2.1.1 报错 http: server gave HTTP response to HTTPS client 在/etc/docker目录下新建daemon.json文件 [root@k8s-master1 kubernetes]# cat /etc/docker/daemon.json { "insecure-registries":["54288.top:5000"] } 参考https://www.cnblogs.com/hobinly/p/6110624.html ``` 很赞哦! (3) 上一篇:缓存和数据库不一致分析及解决方案及多维度化 下一篇:ansible初识 目录 点击排行 Elasticsearch6.3.2之x-pack redis哨兵 2019-07-09 22:05 Redis+Twemproxy+HAProxy+Keepalived 2019-07-12 17:20 GC优化策略和相关实践案例 2019-10-10 10:54 JVM垃圾回收器 2019-10-10 10:23 标签云 Java Spring MVC Mybatis Ansible Elasticsearch Redis Hive Docker Kubernetes RocketMQ Jenkins Nginx 友情链接 郑晓博客 佛布朗斯基 凉风有信 MarkHoo's Blog 冰洛博客 南实博客 Rui | 丁D Java研发工程师 生活可以用「没办法」三个字概括。但别人的没办法是「腿长,没办法」、「长得好看,没办法」、「有才华,没办法」。而你的没办法,是真的没办法。 请作者喝咖啡