一.docker安装
1、Docker版本
社区版(Community Edition):CE (常用)
企业版(Enterprise Edition):EE
2、Docker官网
https://www.docker.com/
3、Docker文档
https://docs.docker.com
以下以Centos7系统上的安装为例(环境需求在Centos7以上,目前Centos7.6是最新的)
https://docs.docker.com/install/linux/docker-ce/centos/
Docker从1.13版本开始,分为CE和EE。生产中v17的用的比较多。
4、安装步骤
安装前先关闭防火墙:systemctl stop firewalld
并禁止开机启动:systemctl disable firewalld
关闭selinux:vim /etc/selinux/config
1)安装依赖包
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
2)配置yum源(这个yum源会自动下载最新版本的Docker)。执行后,会在/etc/yum.repos.d/ 下新增了一个文件docker-ce.repo
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3)安装Docker程序
yum install docker-ce -y
4)启动Docker服务并加入开机启动
systemctl start docker
systemctl enable docker
5)验证
docker run hello-world
5、查看Docker版本
docker info/docker version
6、下载一个测试镜像
1)docker run -it nginx (下载nginx镜像,并在前台运行)
2)查看docker进程 docker ps
3)访问容器 docker inspect 容器ID
4)进入这个容器中 docker exec -it 容器ID bash
二,镜像管理
1、镜像是什么
2、看镜像的分层
docker history nginx(镜像名称)
3.镜像从哪里来
docker hub 是由docker公司负责维护的公共注册中心,下载地址https://hub.docker.com/explore
1) 检索镜像仓库 docker search nginx
2) 图形界面的镜像页面 https://hub.docker.com/explore在这里可以查找想要的镜像,并有使用说明.
3) 修改镜像地址,因为默认是国外的镜像地址,下载速度慢,所以可以修改成国内的镜像地址
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
再重启docker服务后就生效了:systemctl restart docker
4.镜像与容器的联系
1)后台运行镜像: docker run -itd nginx
2)Docker可以通过一个镜像来创建多个容器,镜像没有复制,只是标记引用。
3)通过命令docker exec -it cfece52e4b02 bash 进入容器后,就进入了可写区域(可写层)。在容器中做的修改只保留在容器中,并没有修改镜像中的内容。当这个容器被删除后,在这个容器中做的修改就没有了。
4)镜像启动后要加载系统文件 resolv.conf hosts hostname
5.管理镜像常用命令
docker image save jdk1.8 > jdk.tar#将当前的一个镜像文件保存为一个文件
docker image load < jdk.tar #然后将文件导入到镜像环境中
三 容器管理
1.创建容器常见选项
docker container run 选项 image
示例:docker container run -d -p 88:80 --name web nginx
2.容器运行资源限制
注意:当容器没有内存和cpu限制时,会使用所有物理内存和所有的cpu资源。
建议:如果一个系统上跑多个容器,建议做下资源限制。
3.管理容器常用命令
docker ps -l:查看最近创建的容器
docker ps -a:查看所有容器
四. 管理应用程序数据
docker 提供三种方式将数据从宿主机挂载到容器中:
volumes: Docker管理宿主机文件系统一部分(/var/lib/docker/volumes/)
bind mounts: 将宿主机上的任意位置的文件或者目录挂载到容器中。
tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储到任何位置,可以使用tmpfs.
1.volumes管理示例
docker volume create nginx-vol #创建容器卷
docker volume ls #查看所有容器卷
docker volume inspect nginx-vol(/var/lib/docker/volumes/nginx-vol/_data 这是数据卷存放位置)
[
{
"CreatedAt": "2019-06-18T17:59:40+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
docker run -d --name=nginx01 -p 88:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
#用卷创建一个容器。
修改/var/lib/docker/volumes/nginx-vol/_data/index.html,
新添加一行:this is new content
然后本地浏览器访问:
如果容器nginx01不可用,随后可以创建个新的容器,做同样的挂载目录,数据依然在。
docker run -d --name=nginx02 -p 88:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
特点:移植性强;多个容器之间可以挂载相同的卷;多个运行容器之间共享数据。
2.bind mounts
两种方式:
docker run -d -it --name=nginx-test --mount type=bind,src=/app/wwwroot,dst=/etc/nginx/html nginx
docker run -d -it --name=nginx-test -v /app/wwwroot:/etc/nginx/html nginx
注意:如果container中的目录已经有内容,那么docker会使用host上的目录将其覆盖掉
区别:
五. 容器网络
举例:
2)Docker pull busybox
docker run -it --name bs1 --net=host busybox
进入容器,ifconfig执行后的结果和宿主机网络环境一致。
3)docker run -it --name bs2 --net=none busybox
4)-net=container:Name/ID
docker run -itd --name bs -p 99:80 busybox
创建一个容器,需求:想访问99能访问对应的80端口的服务。
docker run -d --name nginx80 --net container:bs nginx
#其实把nginx80容器的网络空间赋予给bs容器。
查看bs的网络空间查看,能看到80端口。
5)自定网络实现内部dns发现。
docker network create bs-test
docker run -it --name bs1 --net bs-test busybox #运行容器1
/ # ping bs2
通
docker run -it --name bs2 --net bs-test busybox #运行容器2
/ # ping bs1
通
在每个容器中ping 对方的name,都能平通。
六.Harbor仓库
Harbor概述
官方地址:https://github.com/goharbor/harbor
1.Docker-compose安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.Harbor安装
Docker-compose ps
3.推送镜像到harbor中
1)docker tag nginx:new 188.121.234.176/library/nginx:v1 #首先对要上传的镜像打标签
2)docker push 188.121.234.176/library/nginx:v1 #推送镜像到harbor中的library仓库。
提示如上的时候操作:
[root@docker-virtualenv harbor]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["http://f1361db2.m.daocloud.io"],
"insecure-registries": ["188.121.234.176"]
}
重启docker,docker-compose
systemctl start docker
3)再次执行docker push 188.131.244.172/library/nginx:v1,提示“requested access to the resource is denied”,这是因为library仓库只允许下载,不允许上传。
解决办法:
4) 再次执行
docker login 188.131.244.172
输入用户密码
docker push 188.131.244.172/library/nginx:v1.
4.拉取镜像:
docker pull 188.131.244.172/library/tomcat:v1
七,Dockerfile
1.减少镜像层
FROM centos:7
MAINTAINER www.ctnrs.com
RUN yum install epel-release -y && \
yum install -y gcc gcc-c++ make
RUN wget http://docs.php.net/distributions/php-5.6.36.tar.gz && \
tar zxf php-5.6.36.tar.gz && \
cd php-5.6.36 && \
./configure --prefix=/usr/local/php && \
make -j 4 && make install
EXPOSE 9000
CMD ["php-fpm"]
2.优化镜像大小
FROM centos:7
MAINTAINER www.ctnrs.com
RUN yum install epel-release -y && \
yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
libcurl-devel libjpeg-devel libpng-devel openssl-devel \
libmcrypt-devel libxslt-devel libtidy-devel autoconf \
iproute net-tools telnet wget curl && \
yum clean all && \
rm -rf /var/cache/yum/*
3.减少网络传输时间
4.多阶段进行镜像构建
FROM maven AS build
ADD ./pom.xml pom.xml
ADD ./src src/
RUN mvn clean package
FROM lizhenliang/tomcat
RUN rm -rf /usr/local/tomcat/webapps/ROOT
COPY --from=build target/*.war /usr/local/tomcat/webapps/ROOT.war
首先,第一个FROM 后边多了个 AS 关键字,可以给这个阶段起个名字。
然后,第二部分FROM用的我们上面构建的Tomcat镜像,COPY关键字增加了—from参数,用于拷贝某个阶段的文件到当前阶段。这样一个Dockerfile就都搞定了。