docker

Docker COPY 复制文件夹的诡异行为

命令

Dockerfile

  1. # 告诉 Docker 使用哪个镜像作为基础
  2. FROM ubuntu
  3. MAINTAINER yanjing
  4. RUN mkdir -p /usr/lib/jvm/jdk1.8
  5. RUN mkdir /usr/local/tomcat
  6. RUN mkdir /usr/local/zookeeper
  7. # COPY 复制本地文件到镜像
  8. COPY jdk1.8/ /usr/lib/jvm/jdk1.8/
  9. COPY tomcat/ /usr/local/tomcat/
  10. COPY zookeeper/ /usr/local/zookeeper/
  11. COPY web.war /usr/local/tomcat/webapps/
  12. ENV JAVA_HOME /usr/lib/jvm/jdk1.8
  13. ENV JRE_HOME ${JAVA_HOME}/jre
  14. ENV CLASSPATH .:${JAVA_HOME}/lib/dt.jar:${JRE_HOME}/lib/tool.jar
  15. ENV TOMCAT_HOME /usr/local/tomcat
  16. ENV PATH ${JAVA_HOME}/bin:${JRE_HOME}/bin:${TOMCAT_HOME}/bin:${ZOOKEEPER_HOME}/bin:$PATH
  17. # 向外部开放端口
  18. EXPOSE 8090
  19. ENTRYPOINT ["zkServer.sh", "start"]
  20. # 容器启动后运行的程序
  21. CMD ["/usr/local/tomcat/bin/catalina.sh", "run"]

build

  1. # build镜像(具名file)如果改变了Dockerfile名字,则需要指定 -f 文件名称
  2. docker build -t deepdraw_image:test -f ./deepdawDockerFile .
  3. docker build -t xiaochangwei/tomcat:v1 --rm=true .
  4. # 默认当前目录的Dockerfile
  5. docker build -t deepdraw_image:test .

镜像

  1. # 查看centos镜像是否存在
  2. docker search centos
  3. # 利用pull命令获取镜像
  4. docker pull centos
  5. # 方仓库注册服务器下载较慢,可以从其他仓库下载
  6. docker pull dl.dockerpool.com:5000/ubuntu:12.04
  7. # commit 修改已有镜像
  8. # 其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;
  9. 之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息
  10. $ sudo docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2
  11. # tag
  12. sudo docker tag 5db5f8471261 ouruser/sinatra:devel
  13. # push
  14. sudo docker push ouruser/sinatra
  15. # 删除镜像
  16. docker rmi image_name/image_id
  17. docker rm -fv $(sudo docker ps -aq) # 注意括号内也要sudo
  18. docker rmi $(sudo docker images | grep "none" | awk '{print $3}') # 删除所有none的镜像
  19. # 导入导出镜像
  20. docker save -o centos.tar xianhu/centos:git # 保存镜像, -o也可以是--output
  21. docker load -i centos.tar # 加载镜像, -i也可以是--input

run

  1. # 查看正在运行的容器信息
  2. $sudo docker ps
  3. $sudo docker container ls
  4. # 终止状态的容器可以用 docker container ls -a 命令看到
  5. $sudo docker ps -a
  6. $sudo docker container ls -a
  7. # 日志
  8. docker logs container_name/container_id
  9. # 启动一个容器
  10. # 这里-it是两个参数:-i和-t。前者表示打开并保持stdout,后者表示分配一个终端(pseudo-tty)
  11. # -i: 以交互模式运行容器,通常与 -t 同时使用;
  12. # -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  13. # -d: 后台运行容器,并返回容器ID;
  14. docker run ubuntu:18.04 /bin/echo 'Hello world'
  15. docker run -it centos:latest /bin/sh
  16. docker run -d -p 8080:8080 jpress
  17. docker run --name javademo -d -p 7001:7001 jdk8demo
  18. # 进行挂载目录,运行tomcat容器,设置开机自启:--restart=always
  19. docker run -d -p 8088:8080 -v /warPackage/:/usr/local/tomcat/webapps --restart=always docker.io/tomcat
  20. # 所有的stdout都输出到log
  21. docker run centos:latest /bin/sh -c "while true; do echo hello; sleep 1; done"
  22. docker run -d centos:latest /bin/sh -c "while true; do echo hello; sleep 1; done"

操作容器

  1. # 启动、停止、重启容器命令:
  2. docker start container_name/container_id
  3. docker stop container_name/container_id
  4. docker restart container_name/container_id
  5. # 删除容器
  6. docker rm container_name/container_id
  7. docker rm -f container_name/container_id # 运行中的
  8. #清理所有处于终止状态的容器
  9. docker container prune
  10. # 进入容器
  11. $sudo docker exec -it d3a946c4b2bc bash
  12. $sudo docker attach d3a946c4b2bc # 如果从这个 stdin 中 exit,会导致容器的停止

bash或sh终端

bash is not present in mariadb Docker image. Use docker exec -it e44671200b7c /bin/sh or simply docker exec -it e44671200b7c sh instead.

image.png
这个应该是默认command吧

部署web应用

数据库连接

sudo docker run -d -p 8090:8090 deepdraw-war:net

搭配zookeeper容器,软连接到本地data和conf

sudo docker run —network host -v /home/yanjing/deploy/zk/dockerZk/data:/data -v /home/yanjing/deploy/zk/dockerZk/conf:/conf —name zookeeper-2181 -d zookeeper:3.5.5

表示启动容器后执行的操作

ENTRYPOINT /tomcat/bin/startup.sh && tail -F /tomcat/logs/catalina.out

CMD [“/docker_home/local/tomcat7/bin/catalina.sh”,”run”]

  1. [docker搭建zookeeper集群](https://blog.csdn.net/ypp91zr/article/details/89423878?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5.control): docker内连接主机的data和conf(新建文件,与主机zookeeper区分开)
  2. <a name="P9hnL"></a>
  3. ### 其它命令
  4. ```bash
  5. ENV CATALINA_OPTS -Xms128m -Xmx1024m -XX:PermSize=64M -XX:MaxPermSize=512M
  6. RUN cd /tomcat/logs && echo "1" >>count.txt

数据管理

数据卷

  1. # 在主机里使用以下命令可以查看 web 容器的信息
  2. # 数据卷 信息在 "Mounts" Key 下面
  3. $ docker inspect web
  4. # 创建一个数据卷
  5. $ docker volume create my-vol
  6. # 查看所有的 数据卷
  7. $ docker volume ls
  8. # 查看指定 数据卷 的信息
  9. $ docker volume inspect my-vol
  10. # 启动一个挂载数据卷的容器
  11. $ docker run -d -P --name web \
  12. # -v my-vol:/usr/share/nginx/html \
  13. --mount source=my-vol,target=/usr/share/nginx/html \
  14. nginx:alpine
  15. # 删除数据卷
  16. $ docker volume rm my-vol
  17. $ docker volume prune

挂载主机目录

  1. $ docker run -d -P \
  2. --name web \
  3. # -v /src/webapp:/usr/share/nginx/html \
  4. --mount type=bind,source=/src/webapp,target=/usr/share/nginx/html \
  5. nginx:alpine

K8S

image.png image.png

概念

国内源

apt-get update && apt-get install -y apt-transport-https curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat </etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet=1.17.3-00 kubeadm=1.17.3-00 kubectl=1.17.3-00

  1. <a name="sj7eB"></a>
  2. ### 安装 master 节点
  3. [kubernetes安装(国内环境)](https://zhuanlan.zhihu.com/p/46341911)看评论,用阿里镜像,旧版本。
  4. ```bash
  5. sudo kubeadm init --apiserver-advertise-address=192.168.3.8
  6. --image-repository=registry.aliyuncs.com/google_containers
  7. --pod-network-cidr=10.244.0.0/16
  8. --kubernetes-version=1.17.3

安装成功

  1. Your Kubernetes control-plane has initialized successfully!
  2. To start using your cluster, you need to run the following as a regular user:
  3. mkdir -p $HOME/.kube
  4. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  5. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  6. You should now deploy a pod network to the cluster.
  7. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  8. https://kubernetes.io/docs/concepts/cluster-administration/addons/
  9. Then you can join any number of worker nodes by running the following on each as root:
  10. kubeadm join 192.168.3.8:6443 --token qd7rym.cstgtuobf9nc2v62 \
  11. --discovery-token-ca-cert-hash sha256:c6dc1dbc2ec89188c6883862b4a89d442bd9a6ac4959e2948bb8260fe01861b2

kubernetes出于安全考虑默认情况下无法在master节点上部署pod,于是用下面方法解决:

  1. kubectl taint nodes --all node-role.kubernetes.io/master-

部署java应用

Kubernetes之在k8s中部署Java应用
k8s-集群里的三种IP(NodeIP、PodIP、ClusterIP)
k8s通过service访问pod

  1. # 排错
  2. kubectl describe pod tikv-0
  3. kubectl describe nodes host1
  4. kubectl get pods -o wide
  5. # 集群内部测试连通性,Pod 分配了各自的 IP,这些 IP 只能被 Kubernetes Cluster 中的容器和节点访问。
  6. curl 10.244.1.28
  7. # 测试nodeport是否正常工作
  8. kubectl get svc
  9. # PORT(S) 为 80:30713。8080 是 ClusterIP 监听的端口(每个节点都有该端口),
  10. # 30713 则是节点上监听的端口。Kubernetes 会从 30000-32767 中分配一个可用的端口,
  11. # 每个节点都会监听此端口并将请求转发给 Service。
  12. url 192.168.3.8:30713
  13. # 日志
  14. sudo kubectl logs deepdraw-66d9964485-tqd2z

附录