摘要Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
docker
使用docker优点?
1.打包应用 到容器中 2.隔离 3.启动快
什么是docker?
Docker 镜像(Image)就是一个只读的模板。例如:一个镜像可以包含一个完整的操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。
仓库(Repository)是集中存放镜像文件的场所,docker hub。
Docker 利用容器(Container)来运行应用。容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
安装docker
https://docs.docker.com/install/linux/docker-ce/centos/
常用命令
//查看镜像
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
//查看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来指定创建新的镜像
//方式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.创建一个文件夹。
mkdir docker
2.将apache-tomcat-8.5.40.tar.gz jdk-8u144-linux-x64.tar.gz 复制到docker文件夹中 Dockerfile的文件中的相对路径是Dockerfile所在的目录
cp
/usr/local/apache-tomcat-8.5.40.tar.gz
~/docker
cp
/usr/local/jdk-8u144-linux-x64.tar.gz
~/docker
3.创建并编写Dockerfile文件
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
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目录
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
5.运行容器
//第一个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
运行一个war包
//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
//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访问
GRANT ALL PRIVILEGES ON
*.*
TO
'root'@'%'
IDENTIFIED BY
'123456'
WITH GRANT OPTION;
flush privileges;
问题:
由于我重启了防火墙,但是没有重启docker,启动容器报错!!
docker0:
iptables:
No
chain/target/match by that name
解决方案:重启docker:
service restart docker
登录docker容器内部在/etc/profile,source
/etc/profile配置环境变量不生效
解决方案:
1.Dockerfile配置文件使用env来配置
推荐
2.运行容器的时候使用--env来指定。上面就是这个做的/root/.bashrc
3.登录容器中配置在/root/.bashrc文件中(没试过)
docker pull
54288.top:/registry:2.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