设为首页 收藏本站
查看: 1227|回复: 0

[经验分享] docker_基础_2

[复制链接]

尚未签到

发表于 2019-2-22 07:46:10 | 显示全部楼层 |阅读模式
接上篇
  上篇文件


8、数据管理
  docker数据持久化,数据共享,容器数据管理操作

  数据卷(Volumes):容器内数据直接映射到本地主机环境
数据卷容器 (Bind mounts):使用特定容器维护数据卷
  数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
数据卷 可以在容器之间共享和重用
对 数据卷 的修改会立马生效
对 数据卷 的更新,不会影响镜像
数据卷 默认会一直存在,即使容器被删除


8.1、容器内创建一个数据卷
  docker run -v 或者  --mount 可以使用一个或多个-v创建多个数据卷,推荐使用--mount

     注意: 数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷

创建一个web容器,并创建一个数据卷挂载到容器的/app目录下
docker run -d -p 80:80 --name nginx -v /app nginx
# 挂载一个目录到nginx的index目录中,映射端口为80,并将主机的/tmp/html做为容器/usr/share/nginx/html/的数据卷
docker run -d -p 80:80 --name nginx -v /tmp/html:/usr/share/nginx/html nginx
5649d6fd05465f9a4839e3c95fb239fb58f8c82f7b8c28133d1e02da26228cee
本地目录必须是绝对路径,如果目录不存在,docker会自动创建
# 附加到容器中测试数据卷
$ cker exec -it nginx /bin/bash
root@b16b8b455d69:/usr/share/nginx/html# touch b
root@b16b8b455d69:/usr/share/nginx/html# exit
# 这样容器被删除之后,数据也能持久保存了
$ ls  /tmp/html/
aa   index.html


docker 挂载数据卷默认权限是rw,可以通过ro指定为只读
$ docker run -d -p 81:80 --name nginx2 -v /tmp/html/:/usr/share/nginx/html/:ro nginx
0817c41c79db18bac66f646e464af2186cbdc2e2261233985b4c2009a8b07ced
# 附加至容器中 该容器数据卷为ro就没法修改了
$ docker exec -it nginx2 /bin/bash
root@0817c41c79db:/# cd /usr/share/nginx/html/
root@0817c41c79db:/usr/share/nginx/html# touch b
touch: cannot touch 'b': Read-only file system

     注意:如果挂载的是一个文件,使用文本编辑过之后会造成inode更改,这将会导致报错误信息,所以推荐的方式是直接使用挂载文件所在的目录。

创建一个数据卷
docker volume create my-volume
my-volume
查看数据卷
docker volume ls
DRIVER              VOLUME NAME
local               my-volume
查看数据卷的详细信息
docker volume inspect my-volume
[
{
"CreatedAt": "2018-04-04T00:56:58+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
"Name": "my-volume",
"Options": {},
"Scope": "local"
}
]
挂载容器
docker run -d -p 80:80 --name web \
# --v my-volume:/webapp
--mount source=my-volume,target=/webapp  nginx
8d0782dffc01b00c05861c3691d4d7bdde848c79965589e6a8ab0c01a07a37c5
测试挂载
[root@dockers html]#docker exec -it web /bin/bash
root@8d0782dffc01:/webapp# touch a
root@8d0782dffc01:/webapp# exit
[root@dockers html]#  ls /var/lib/docker/volumes/my-volume/_data/
a
使用 docker inspect web 可查看容器的详细信息
查看挂载信息
docker inspect -f "{{".Mounts"}}" web
[{volume my-volume /var/lib/docker/volumes/my-volume/_data /webapp local z true }]
先检查数据卷目录下的文件
ls /var/lib/docker/volumes/
795747aac04e250aa24ff4ef48d5ef8f4d30bead6267d2dd39de1efed8eb093e  metadata.db  my-volume
删除数据卷
docker volume rm my-volume
再次查看数据卷的确是被删除了
ls /var/lib/docker/volumes/
795747aac04e250aa24ff4ef48d5ef8f4d30bead6267d2dd39de1efed8eb093e  metadata.db
     数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷 ,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。无主的数据卷可能会占据很多空间,要清理请使用以下命令

$ docker volume prune

8.2、数据卷容器

  使用--volumes-from 挂载另一个容器的数据卷

  如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式就是使用数据卷容器
创建一个数据卷  这里同时使用-v --mount配置
docker volume create my-vol
挂载数据卷容器
docker run -dit --mount source=my-vol,target=/tmp/test --name web1 centos
或 # docker run -dit -a my-vol:/tmp/test --name web1 centos
查看挂载容器的目录
docker exec -it web1 ls -d /tmp/test
/tmp/test
新建两个容器,用于测试文档的创建
docker run -dit --volumes-from web1 --name db1 centos
docker run -dit --volumes-from web1 --name db2 centos   
查看db2号容器的挂载信息,它的确已经挂载了本地的这个目录
docker inspect -f "{{".Mounts"}}" db2
[{volume my-vol /var/lib/docker/volumes/my-vol/_data /tmp/test local  true }]
新建两个目录用于测试
docker exec -it web1 touch /tmp/test/web1.txt
docker exec -it db1 touch /tmp/test/db1.txt
查看容器是否已经成功创建了二个文件
docker exec -it db2 ls /tmp/test/
db1.txt  web1.txt
查看本地容器是否也同时创建了文件
ls /var/lib/docker/volumes/my-vol/_data/
db1.txt  web1.txt
使用db2做为db_3l_1的容器数据卷
docker run -dit --volumes-from db2 --name db_3l_1 centos
查看/tmp/test/文件跟先前一样
停止 web1 容器
docker stop web1
查看 db2 以及db2下关连的容器挂载也是正常的。


8.3、利用数据卷容器迁移数据
     利用数据卷容器对其中的数据卷进行备份、恢复以实现数据的迁移


# 首先先创建一个数据卷
docker volume create my-vol
# 创建一个镜像,这个镜像一定要有一个数据卷才行.没有数据卷的表示并没有操作成功
docker run -it --mount source=my-vol,target=/backup --name base_mount centos
# 进入容器创建几个文件用于测试 touch {a,b,c,d,e}
使用**组合键 ctrl + p + q **退出容器,容器也不会停止
# 将前一个容器的数据打包备份
docker run --volumes-from base_mount -v /tmp/html/:/back --name save_dir centos tar cvf /back/backup.tar /backup
运行一个空器,数据卷来自base_mount ,挂载一个本地文件夹到容器的back目录 名称叫save_dir 来自centos镜像,然后将上一个容器的文件夹打包。
恢复
docker run -it -v /tmp/back/:/mydata --name mydata1 centos
# 恢复文件
docker run -dit --volumes-from mydata1 -v /tmp/html:/back --name relode2 centos tar xf /back/back.tar.gz -C /mydata
运行一个容器,数据卷来自mydata1,挂载本地文件到 back目录,然后解压文件到数据卷挂载的目录中,这个容器启动之后就会失效,不用管它,我们的目的是让它恢复文件到 mydata1容器中。
# 查看mydata容器中的文件看是否已经恢复
[root@dockers tmp]# docker exec -it mydata1 /bin/bash
[root@dd579e119718 /]# ls mydata/
ks-script-5IE1zn  yum.log


9、端口映射与容器互联
    docker提供了两个很方便的功能来满足服务访问的基本需求:一个是允许映射容器内应用的服务端口到 本地宿主机,另一个是允许多个容器间通过容器名来快速访问,但最后建议直接使用 Docker网络来连接多个容器


9.1、端口映射
    外部访问这些应用时,可以通过-p或者-P来指定端口映射,当使用 -P(大写) docker会随机映射一个49000-49900的端口到内部容器开放的网络端口。
  -p可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器,支持的格式 IP:HOSTPORT:ContainerPort  一般常用格式为 -p 80:80

一对一映射
docker run -dit -p 80:80 --name app1 nginx
多对多映射
docker run -dit -p 80:80  -p 8080:8080 --name app2  nginx
映射一个随机端口
docker run -dit -p :80 --name app3 nginx
36ff96bd9e45        nginx               "nginx -g 'daemon of…"   2 seconds ago       Up 1 second         0.0.0.0:32769->80/tcp    app3
指定Udp端口
docker run -dit -p :23433/udp --name app4  nginx
5655a46fb10c        nginx               "nginx -g 'daemon of…"   2 seconds ago        Up 1 second         80/tcp, 0.0.0.0:32768->23433/udp   app4
前面那个80是内部端口并没有映射出来,所以也没法访问
查看映射端口配置
语法: docker port [container-id]
docker port app4
23433/udp -> 0.0.0.0:32768
9.2、互联机制实现便捷互访
     容器的互联是一种让多个容器中应用进行快速交互的方式,它会在源和接收容器之间创建连接关系,接收容器可以通过容器名快速访问到源容器,而不用指定具体的IP,但最后建议直接使用 Docker网络来连接多个容器

使用 --name为容器自定义命名
docker run -d -p --name web nginx

      注意:容器的名称是唯一的,如果已经有一个叫web的容器了,那么一定要先删除同名的容器才能继续使用这个新的. 并且在执行docker run的时候添加了--rm标记,容器会在终止后立即删除, --rm 与-d不能同时使用

容器互联 --link  参数格式  --like container_name:alias,这个container_name是要连接容器的名称,alias是别名
创建一个新的db容器,这里只是测试,如果想用做其它用途可以使用数据卷持久化的方式保存数据文件
docker run -dit --name db mysql
然后创建一个web容器,并将它连接到DB容器
docker run -d --name web --link db:mydb nginx
( 我这里Command显示不全) 用docker inspect 可看到完整信息
       这相当于是在两个容器中建立了一条虚拟通道,从而不用映射它们端口到宿主主机上,在启动DB也没有加任何参数,从而避免了数据库服务器到外部网络上。

[root@dockers tmp]# docker run --rm --name web2 --link db:mydb nginx env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=0a19c5371081
MYDB_PORT=tcp://172.17.0.4:5432
MYDB_PORT_5432_TCP=tcp://172.17.0.4:5432
MYDB_PORT_5432_TCP_ADDR=172.17.0.4
MYDB_PORT_5432_TCP_PORT=5432
MYDB_PORT_5432_TCP_PROTO=tcp
.......
  MYDB开头的是供web容器连接db容器使用的,
  此外它还更新了/etc/hosts文件用于容器之间的连通性,

docker run -it --rm --name web3 --link db:mydb nginx /bin/bash
root@8c23bcf93baa:/# cat /etc/hosts
........
172.17.0.4  mydb 76d04432e90d db
172.17.0.6  8c23bcf93baa
可以安装ping工具测试一下,需要dockerfile文件构建。

9.3、network网络互联
     随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数


新建一个网络
docker network create -d bridge my-net
-d 参数指定 Docker 网络类型,有 bridge overlay 。其中 overlay 网络类型用于Swarm mode
查看网络
docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
105ebee92a2d        my-net              bridge              local
创建两个容器并加入新建的网络中用于互联
$ docker run -it  --name web1 --network my-net centos
$ docker run -it --name web2 --network my-net centos
通过 ping 来证明 web1 容器和 web2 容器建立了互联关系
[root@7f96e5dbaa0f /]# ping web1
PING web1 (172.18.0.2) 56(84) bytes of data.
64 bytes from web1.my-net (172.18.0.2): icmp_seq=1 ttl=64 time=0.057 ms
  Docker Compose
    如果你有多个容器之间需要互相连接,推荐使用 Docker Compose

9.3、配置dns

在容器中查看挂载信息
mount | grep etc
/dev/mapper/centos-root on /etc/resolv.conf type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/centos-root on /etc/hostname type xfs (rw,relatime,attr2,inode64,noquota)
/dev/mapper/centos-root on /etc/hosts type xfs (rw,relatime,attr2,inode64,noquota)
      这种机制可以让宿主主机 DNS 信息发生更新后,所有 Docker 容器的 DNS 配置通过/etc/resolv.conf 文件立刻得到更新。
      配置全部容器的 DNS ,也可以在 /etc/docker/daemon.json 文件中增加以下内容来设置。
{
"dns" : [
"114.114.114.114",
"8.8.8.8"
]
}
      -h 设定容器主机名,它会被写到容器内的/etc/hostname 和 /etc/hosts 。但它在容器外部看不到,既不会在 docker container ls 中显示,也不会在其他的容器的 /etc/hosts 看到
    --dns=IP_ADDRESS 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。
      注意:如果在容器启动时没有指定最后两个参数,Docker 会默认用主机上的/etc/resolv.conf 来配置容器

10、实战-web应用
   实战必须约定好的步骤:
    1、创建一个空的目录,防止上下文复制的问题
    2、创建的容器目录名一定要见名知意
    3、配置一定是Dockerfile 直接build而不是用-f指定dockerfile文件
    4、往下所有dockerfile的都是这么约束。
    5、Host表示为主机 Container表示为容器

10.1、为镜像添加ssh服务
  Dockerfile 文件下载地址
  使用镜像生成容器,打包成镜像然后运行脚本的方式

从宿主机上启动一个容器
Host # docker run -it --name TestSsh centos
安装openssh,清空缓存减少硬盘容量
container_id# yum -y install openssh-server
container_id# rm -rf /var/cache/yum/*
后台试启动一下sshd服务
container_id# /usr/sbin/sshd -D &
报的错误
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.
[1]+  Exit 1                  /usr/sbin/sshd -D
解决处理办法
container_id# ssh-keygen -t dsa -f /etc/ssh/ssh_host_rsa_key
container_id# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ed25519_key
container_id# ssh-keygen -t dsa -f /etc/ssh/ssh_host_ecdsa_key
container_id# /usr/sbin/sshd -D &
脚本
container_id# cat sshd.sh
#!/bin/bash
#
/usr/sbin/sshd -D
container_id# exit
找到这个容器的ID号 使用 docker ps -a
使用docker commit container_id images/tag 制件一个镜像
docker commit 6e5c099e5145 sshd/centos:v1.0
查看镜像
Host # docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sshd/centos         v1.0                fab9e2701710        26 seconds ago      218MB
运行一个容器
Host # docker run -dit --name ssh1 -p 30:22 sshd/centos:v1.0 /sshd.sh
查看运行的容器也可以使用 docker container ls
[root@dockers ontwo]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
f08580be724e        sshd/centos:v1.0    "/sshd.sh"               3 seconds ago       Up 3 seconds        0.0.0.0:30->22/tcp       ssh1

  验证: 需要用户密码,可以将ssh的pam验证功能暂时关闭,或生成一个root密码

  使用Dockerfile方式添加ssh服务

创建目录并配置Dockerfile
[root@dockers ssh]# cat Dockerfile
# 基础镜像是centos
FROM centos
# 复制 启动配置文件
COPY run.sh /run.sh
# 安装openssh-server 删除缓存文件,创建.ssh目录,最后一定要生成那三个key文件否则会报手动安装时的报错信息
RUN yum -y install openssh-server \
&& rm -rf /var/cache/yum/* \
&& mkdir -p /root/.ssh \
&& chmod +x /run.sh \
&& ssh-keygen -t dsa -f "/etc/ssh/ssh_host_ecdsa_key" -P "" \
&& ssh-keygen -t dsa -f "/etc/ssh/ssh_host_ed25519_key" -P "" \
&& ssh-keygen -t dsa -f "/etc/ssh/ssh_host_rsa_key" -P ""
# 无密码直接登陆,也可以直接关掉pam模块直接登陆测试,或新建一个用户
COPY authorized_keys /root/.ssh/authorized_keys
# 或者开启这行两个都是用于测试
# RUN sed -i "s/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g' /etc/pam.d/sshd
# 开启端口号 22
EXPOSE 22
# 运行脚本
CMD ["/run.sh"]
构建一个镜像
Host # docker build -t sshd:v2 .
查看 镜像  docker images
运行一个容器  docker run -dit -p 33:22 --name xiong sshd:v2
查看容器 docker ps 或 docker container
最后测试



10.2、tomcat

构建一个tomcat+jdk的环境并使用上面的sshd镜像
1、先写一个Dockerfile文件
Host#  cat Dockerfile
# 来自于上一个镜像的sshd服务
FROM sshd:v2
# 复制并解压文件
ADD apache-tomcat-7.0.82.tar.gz /usr/local/
# 复制jdk
COPY jdk-8u77-linux-x64.rpm /usr/src/
# 复制运行脚本到/tmp目录下
# tomcat_passwd_change.sh and run.sh
COPY *.sh /tmp/
# 安装jdk,并清空缓存文件,以及给脚本复制权限
RUN jdk_dir=/usr/src/jdk-8u77-linux-x64.rpm \
&& rpm -ih $jdk_dir \
&& rm -rf $jdk_dir \
&& ln -sv /usr/local/apache-tomcat-7.0.82 /usr/local/tomcat \
&& chmod +x /tmp/*.sh
# 配置环境变量
ENV CATALINAE_HOME /usr/local/tomcat
ENV JAVA_HOME /usr/java/default
ENV PATH $CATALINAE_HOME/bin:$JAVA_HOME:$PATH
# 声明端口
EXPOSE 8080
# 运行脚本
CMD ["/tmp/run.sh"]
以下是二个脚本的内容
Host# cat run.sh
#!/bin/bash
#
# change tomcat shutdown password, then password file save from /tmp/tomcat_passwd.txt
/bin/bash /tmp/tomcat_passwd_change.sh
/usr/sbin/sshd -D &
exec ${CATALINAE_HOME}/bin/catalina.sh run
Host# cat tomcat_passwd_change.sh
#!/bin/bash
#
# 弄三个随机数值组合,给shutdown改变一下密码 防止别人telnet关掉服务
a=`cat /dev/urandom | od -x |head -n 1 | cut -d ' ' -f 3`
b=`cat /dev/urandom | od -x |head -n 1 | cut -d ' ' -f 3`
c=`cat /dev/urandom | od -x |head -n 1 | cut -d ' ' -f 3`
d=$a$b$c
/bin/sed -i "s/shutdown\=\"SHUTDOWN\"/shutdown\="$d"/g" ${CATALINA_HOME}/conf/server.xml
echo $d >> /tmp/tomcat_passwd.txt
构建以及运行容器
docker build -t tom:v1 .
docker run -it -p 8080:8080 -p 33:22 --name tomcat1 tom:v1
JDK就占了338M
Host # docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tom                 v1                  55aac09bb6b1        14 minutes ago      762MB
查看容器 或者 docker container ls
Host# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
71682e392b19        tom:v1              "/tmp/run.sh"            18 minutes ago      Up 18 minutes       0.0.0.0:8080->8080/tcp, 0.0.0.0:33->22/tcp   tomcat1
连接容器的方式 附加 或 ssh
Host# docker exec -it tomcat1 /bin/bash
Host# ssh IPADDR -p 33

  最终效果



10.3、持续集成 jenkins+gitlab

  直接安装并操作的过程,了解手动安装才能更好的写好Dockerfile
jenkins 安装步骤
git 安装步骤
gitlab 官方安装步骤
gitlab下载包

直接使用官方提供的gitlab-ce包
docker pull gitlab/gitlab-ce
# 查看gitlab的历史过程
[root@dockers gitlab]# docker history gitlab/gitlab-ce
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
cb7f154f4459        37 hours ago        /bin/sh -c #(nop)  HEALTHCHECK &{["CMD-SHELL…   0B                  
           37 hours ago        /bin/sh -c #(nop)  CMD ["/assets/wrapper"]      0B                  
           37 hours ago        /bin/sh -c #(nop)  VOLUME [/etc/gitlab /var/…   0B                  
           37 hours ago        /bin/sh -c #(nop)  EXPOSE 22 443 80             0B                  
           37 hours ago        /bin/sh -c #(nop)  ENV TERM=xterm               0B                  
           37 hours ago        /bin/sh -c #(nop)  ENV PATH=/opt/gitlab/embe…   0B                  
           37 hours ago        /bin/sh -c /assets/setup                        1.25GB              
           37 hours ago        /bin/sh -c #(nop) COPY dir:815ee377e84b6d10b…   9.76kB              
           37 hours ago        /bin/sh -c #(nop) COPY file:4234fd7a929be746…   185B               
           37 hours ago        /bin/sh -c ln -fs /dev/null /run/motd.dynamic   0B                  
           37 hours ago        /bin/sh -c rm -rf /etc/update-motd.d /etc/mo…   0B                  
           37 hours ago        /bin/sh -c apt-get update -q     && DEBIAN_F…   71.6MB              
           37 hours ago        /bin/sh -c #(nop)  SHELL [/bin/sh -c]           0B                  
           37 hours ago        /bin/sh -c #(nop)  MAINTAINER GitLab Inc.  /…   745B               
           5 weeks ago         /bin/sh -c #(nop) ADD file:c753df38640ab6e24…   112MB   
运行  挂载1
docker run -dit --name git -p 80:80 -p 443:443 -p 333:22 -mount source=/data:/etc/gitlab/ gitlab/gitlab-ce
查看持久信息
[root@dockers gitlab]# docker inspect -f '{{.Mounts}}' git
[{volume 94a84f701dc0bdbe6a0e62c80faec9a30c4c63b343ad1d317a6d5d5a53f0b0ad /var/lib/docker/volumes/94a84f701dc0bdbe6a0e62c80faec9a30c4c63b343ad1d317a6d5d5a53f0b0ad/_data /etc/gitlab local  true } {volume 4f2281259ab2ab42bfd45b391d32612e5afbd644d03c35604ba4700c1b1dbbd6 /var/lib/docker/volumes/4f2281259ab2ab42bfd45b391d32612e5afbd644d03c35604ba4700c1b1dbbd6/_data /var/log/gitlab local  true } {volume 4649c0fd86c6068037b7f60d3097baf242f877f8c6e353200c0b700b69c2f52f /var/lib/docker/volumes/4649c0fd86c6068037b7f60d3097baf242f877f8c6e353200c0b700b69c2f52f/_data /var/opt/gitlab local  true }]
运行 挂载2,先创建容器卷
[root@dockers gitlab]# docker volume create git-conf
git-conf
[root@dockers gitlab]# docker volume create git-log
git-log
[root@dockers gitlab]# docker volume create git-data
git-data
启动一个容器
[root@dockers volumes]# docker run -dit -p 80:80 -p 443:443 -p 333:22 --mount source=git-conf,target=/etc/gitlab --mount source=git-log,target=/var/log/gitlab --mount source=git-data,target=/var/opt/gitlab --name git2 gitlab/gitlab-ce
046799493e9c803d214fecf215ace53f320dcb3b929c421e7846dd0fbc8c974c
运行完之后检查  /var/lib/docker/volumes/ 创建的卷名称.
查看挂载
"Mounts": [
{
"Type": "volume",
"Source": "git-conf",
"Target": "/etc/gitlab"
},
{
"Type": "volume",
"Source": "git-log",
"Target": "/var/log/gitlab"
},
{
"Type": "volume",
"Source": "git-data",
"Target": "/var/opt/gitlab"
}
]

  最终浏览器的效果


10.4、lnmp

运行一个容器,持久化数据,并启用本地的my.cnf文件,端口设置为3310,密码123456
docker run -dit --name lnmp_mysql -v /data:/var/lib/mysql -v /root/workpress/mysql_conf/my.cnf:/etc/mysql/my.cnf -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 mariadb
创建wp数据库
docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "create database wp"''
查看wp数据库
docker exec lnmp_mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "show databases"'
创建wordpress 站点目录
mkdir /workdir
持久化本地数据,站点端口为89, 采用的是richarvey/nginx-php-fpm
docker run -dit -v /workdir/:/var/www/html --link lnmp_mysql:mysql -p 89:80 --name lnmp_web richarvey/nginx-php-fpm
# 查看phpinfo信息
echo ""  /workdir/index.php
下载wordpress
https://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz
解压直接丢到/workdir目录下,然后就可以正常安装了

11、实战_DB应用


11.1、mysql
  " rel="nofollow">官方mysql配置
docker-mysql配置


启动mysql
Host# docker run -it -p 3306:3306 --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw cytopia/mysql-5.7
附加到 mysql
Host# docker exec -it my-mysql /bin/bash
修改密码及更新权限的相关配置
[root@3d90cbda22d2 /]# mysql -uroot -pmy-secret-pw
mysql> update mysql.user set authentication_string=password("xiong") where User="root";
mysql> select User,Host,authentication_string from mysql.user;
mysql> flush privileges;
查看日志
docker logs my-mysql
关闭容器启动第2个容器
创建my.cnf
[client]
socket = /var/sock/mysqld/mysqld.sock
[mysql]
socket = /var/sock/mysqld/mysqld.sock
[mysqld]
skip-host-cache
skip-name-resolve
datadir = /var/lib/mysql
user = mysql
port = 3306
bind-address = 0.0.0.0
socket = /var/sock/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid
general_log_file = /var/log/mysql/query.log
slow_query_log_file = /var/log/mysql/slow.log
log-error = /var/log/mysql/error.log
!includedir /etc/my.cnf.d/
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/docker-default.d/
server_id=111
log_bin=on
log_bin_basename=/var/lib/mysql/${HOSTNAME}.log
启动docker文件, 约定请看第10章
数据持久化配置 ,防止容器挂掉存储放到持久磁盘中.
[root@dockers conf]# docker run -it -v ${pwd}:/etc/mysql/conf.d/ -v /data:/var/lib/mysql -p 3306:3306 --name my-mysql2 -e MYSQL_ROOT_PASSWORD=xiong cytopia/mysql-5.7


11.2、redis

运行容器
docker run -dit --name my-redis redis
查看容器内的服务
root@98aa42e16575:/data# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
redis        1     0  0 21:44 pts/0    00:00:00 redis-server *:6379
root        14     0  0 21:45 pts/1    00:00:00 /bin/bash
root        19    14  0 21:45 pts/1    00:00:00 ps -ef
查看容器内的环境变量
root@98aa42e16575:/data# env
HOSTNAME=98aa42e16575
REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-4.0.9.tar.gz
TERM=xterm
REDIS_DOWNLOAD_SHA=df4f73bc318e2f9ffb2d169a922dec57ec7c73dd07bccf875695dbeecd5ec510
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/data
SHLVL=1
HOME=/root
REDIS_VERSION=4.0.9
GOSU_VERSION=1.10
_=/usr/bin/env
使用一个容器测试网络连通
--link  连接的容器:别名
root@dockers conf]# docker run -it --rm --link my-redis:db alpine sh
/ # ping db
PING db (172.17.0.7): 56 data bytes
64 bytes from 172.17.0.7: seq=0 ttl=64 time=0.130 ms
64 bytes from 172.17.0.7: seq=1 ttl=64 time=0.072 ms
使用 docker inspect 创建的容器名称可查看详细信息
使用docker镜像自带的redis客户端进行连接  entrypoint
[root@dockers conf]# docker run -it --link my-redis:db --name my-redis2 --entrypoint redis-cli redis -h db
db:6379> get
(error) ERR wrong number of arguments for 'get' command
db:6379> get 1
(nil)
db:6379> set 1 2
OK
db:6379> get 1
"2"



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675495-1-1.html 上篇帖子: 4、《每天5分钟玩转Docker容器技术》学习--Docker环境搭建 下篇帖子: 5、《每天5分钟玩转Docker容器技术》学习--Docker镜像
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表