Docker学习笔记

docker简介
应用之间相互隔离,所有服务都会部署在docker上面,docker部署在linux上

使用docker进行自动化打包发布和持续集成

docker优点
简单部署,节省开支(不需要为了高性能部署多台服务器,应用变成云应用)


docker引擎
是一个服务器,在后台长时间运行

工作原理:通过客户端调用REST API,REST API 再调用docker引擎

docker实例多的时候,可以配合使用kebernetes(k8s)进行管理,
docker可以看成是kubernetes内部使用的低级别的组件,kubernetes支持docker,是另一种容器技术

 

docker 系统架构
docker 使用c/s架构模式,docker中的容器和镜像好比是对象和类,容器是通过镜像创建,一个镜像可以创建多个容器
docker客户端使用命令(比如docker pull) 调用docker host(docker daemon(docker守护进程))
查找镜像文件,本地没有就去Registry拉取,再创建容器

 

docker 安装

CentOS Docker 安装
Docker支持以下的CentOS版本:
CentOS 7 (64-bit)
CentOS 6.5 (64-bit) 或更高的版本
前提条件
目前,CentOS 仅发行版本中的内核支持 Docker。
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
使用 yum 安装(CentOS 7下)
Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Doc
通过 uname -r 命令查看你当前的内核版本
[root@runoob ~]# uname -r
使用脚本安装 Docker
1、使用 sudo 或 root 权限登录 Centos。
删除旧版本的docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
2、确保 yum 包更新到最新。
$ sudo yum update
3、执行 Docker 安装脚本。
$ curl -fsSL https://get.docker.com/ | sh
执行这个脚本会添加 docker.repo 源并安装 Docker。
4、启动 Docker 进程。
$ sudo service docker start
5、验证 docker 是否安装成功并在容器中执行一个测试的镜像。
$ sudo docker run hello-world
到此,docker 在 CentOS 系统的安装完成。

脚本不能安装可以参考:https://blog.csdn.net/doegoo/article/details/80062132

 

 

使用阿里云安装docker  

curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -

service docker restart 

这一步很重要,如果不重启,docker pull时会有如下错误:

  • Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon. Is the docker daemon running on this host?)...

系统镜像加速
docker使用阿里云镜像仓库   地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
1:阿里云docker仓库 https://dev.aliyun.com/search.html

2:进去注册帐号后,点击自己的管理中心。

3:在管理中心点击加速器,右边面板会有你的加速地址,右边面板下面有详细设置步骤。

配置阿里云镜像的时候需要使用systemctl命令,但是该命令不存在,
yum install firewalld systemd -y //使用这个命令替代yum install systemctl


第一个docker应用程序
docker run ubuntu:15.10 /bin/echo "Hello Docker"
参数解释:
docker:Docker 的二进制执行文件
run:与前面的 docker 组合来运行一个容器
ubuntu:15.10:指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像
/bin/echo "Hello Docker":在启动的容器里执行的命令
以上命令完整的意思可以解释为:Docker 以 ubuntu15.10 镜像创建一个新容器,然后在容器里执行 bin/echo "Hello Docker",然后输出结果。

使用docker images 获取本地已经安装的镜像
docker ps 查看正在运行的容器
docker ps -a 查看已经运行的容器
docker rm {容器id} 删除运行的容器
docker rm {容器id} {容器id} 删除多个运行的容器


运行交互式的容器
在linux中,进入docker容器中执行程序
docker run -it ubuntu:15.10 /bin/bash
在linux系统中进入ubuntu:15.10这个容器中,这个容器就是一个小型的linux系统
所以linux系统就是宿主,容器是寄托在宿主上面
退出容器:exit 或者ctrl+D

让容器在后台运行
更多的时候,需要让 Docker 在后台运行而不是直接把执行命令的结果输出在当前宿主机下。此时,可以通过添加 -d 参数来实现。
docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello docker; sleep 1; done"
docker logs {容器id} 查看容器内的标准输出
docker stop {容器id} 停止容器
docker start {容器id} 启动容器
docker restart {容器id} 重启容器
docker exec -it {容器id} /bin/bash 与正在运行的容器交互

docker客户端帮助命令
docker COMMAND --help 比如docker ps --help

运行 WEB 容器
接下来让我们尝试使用 docker 构建一个 web 应用程序。
我们将在 docker 容器中运行一个 Python Flask 应用来运行一个web应用
docker run -d -P training/webapp python app.py
-d:让容器在后台运行
-P:将容器内部使用的网络端口(随机生成的)映射到我们使用的主机上
使用 docker ps 来查看我们正在运行的容器,看到多了端口信息
PORTS
0.0.0.0:32771->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32771 上。
这时我们可以通过浏览器访问WEB应用ip:32771 来访问
我们也可以指定 -p 标识来绑定指定端口
docker run -d -p 5000:5000 training/webapp python app.py

查看docker容器正在运行的进程
docker top {容器名称或id}
使用 docker inspect {容器名称或id} 来查看Docker的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息:


镜像管理
当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub(https://hub.docker.com/explore/) 公共镜像源下载。
docker pull {镜像名称},比如:docker pull tomcat,下载镜像,下载的时候也会将相关的镜像文件也能下载下来
docker rmi {镜像id} 删除镜像
docker search {镜像名称} 搜索镜像

更新镜像
在已经存在的镜像文件中进行修改,保存为新的镜像

更新镜像之前,我们需要使用镜像来创建一个容器:
lusifer@UbuntuBase:~$ docker run -it ubuntu:15.10 /bin/bash
root@9a3dcafd7a83:/# apt-get update
调用这个命令的时候需要FQ,所以我们修改数据源
root@13d3a8ad18f9:/# cd /etc/apt
root@13d3a8ad18f9:/etc/apt#

echo deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse > sources.list
echo deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse >> sources.list
echo deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse >> sources.list
echo deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse >> sources.list

在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。
此时ID为 9a3dcafd7a83 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。
lusifer@UbuntuBase:~$ docker commit -m="has update" -a="lusifer" 9a3dcafd7a83 lusifer/ubuntu:v2
sha256:2642b4944b285974e5f007f30bc33b651220ea9931982c3c53b61a8f8fd5011b
各个参数说明:
-m:提交的描述信息
-a:指定镜像作者
9a3dcafd7a83:容器ID
lusifer/ubuntu:v2:指定要创建的目标镜像名
我们可以使用 docker images 命令来查看我们的新镜像 lusifer/ubuntu:v2:
lusifer@UbuntuBase:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
lusifer/ubuntu v2 2642b4944b28 2 minutes ago 137MB
ubuntu 14.04 dea1945146b9 7 weeks ago 188MB
ubuntu 15.10 9b9cb95443b5 15 months ago 137MB
training/webapp latest 6fae60ef3446 2 years ago 349MB
使用我们的新镜像 lusifer/ubuntu 来启动一个容器:
lusifer@UbuntuBase:~$ docker run -it lusifer/ubuntu:v2 /bin/bash
root@060f7af5fbec:/#

 

使用Dockerfile创建镜像

cd /usr/local/
mkdir docker
cd docker/
mkdir myubuntu
vi Dockerfile
内容如下:

FROM ubuntu:15.10 #该指令用于设置后续指令的基本映像。
MAINTAINER yxl@qq.com #指定镜像的作者
RUN /bin/bash -c 'echo "Hello World"' #该指令用于执行当前映像的任何命令,指令告诉docker 在镜像内执行命令,安装了什么。。。
COPY test.txt /home #该指令用于将来自源的新文件或目录复制到目的地的容器的文件系统。规则:

source路径必须在构建的上下文之内。无法使用COPY ../something /something,因为docker构建的第一步是将上下文目录(和子目录)发送到 docker 守护程序。

如果source是目录,则会复制目录的全部内容,包括文件系统元数据。
WORKDIR /home #WORKDIR用于为Dockerfile中的RUN,CMD和COPY指令设置工作目录。如果工作目录不存在,它默认将会创建。

我们可以在Dockerfile文件中多次使用WORKDIR。
EXPOSE 80 #对外开放的端口
EXPOSE 8080
CMD ["/bin/echo","this is a echo test"] #这用于执行映像的应用程序。这是使用CMD的首选方法。Dockerfile文件中只能有一个CMD。如果使用多个CMD,则只会执行最后一个CMD。


docker build -t yxl/myubuntu . #我们使用命令 docker build ,-t:指定要创建的目标镜像名,.:Dockerfile 文件所在目录,可以指定 Dockerfile 的绝对路径

docker images

docker run -it yxl/myubuntu /bin/bash #使用新的镜像来创建容器
root@db598f3a30be:/home# ll
total 4
drwxr-xr-x. 1 root root 22 May 28 09:00 ./
drwxr-xr-x. 1 root root 6 May 28 09:16 ../
-rw-r--r--. 1 root root 13 May 28 08:52 test.txt


我们可以使用 docker tag {镜像id} 命令,为镜像添加一个新的标签。
docker tag a1e9b87115d4 yxl/myubuntu:dev

Tomcat 在容器内部署
docker run --name tomcat -p 8080:8080 -d tomcat #运行容器名字是tomcat的,使用tomcat镜像部署,端口8080映射到容器端口8080
docker exec -it tomcat /bin/bash #进入到容器
root@7adb6b053b8d:/usr/local/tomcat# ls -l
total 92
-rw-r-----. 1 root root 57092 Apr 27 20:26 LICENSE
-rw-r-----. 1 root root 1723 Apr 27 20:26 NOTICE
-rw-r-----. 1 root root 7138 Apr 27 20:26 RELEASE-NOTES
-rw-r-----. 1 root root 16246 Apr 27 20:26 RUNNING.txt
drwxr-x---. 2 root root 4096 May 15 00:11 bin
drwx--S---. 1 root root 22 May 29 01:11 conf
drwxr-sr-x. 3 root staff 19 May 15 00:11 include
drwxr-x---. 2 root root 4096 May 15 00:11 lib
drwxr-x---. 1 root root 177 May 29 01:11 logs
drwxr-sr-x. 3 root staff 151 May 15 00:11 native-jni-lib
drwxr-x---. 2 root root 30 May 15 00:11 temp
drwxr-x---. 7 root root 81 Apr 27 20:24 webapps
drwxr-x---. 1 root root 22 May 29 01:11 work
root@7adb6b053b8d:/usr/local/tomcat# cd webapps/
root@7adb6b053b8d:/usr/local/tomcat/webapps# ls -l
total 8
drwxr-x---. 3 root root 4096 May 15 00:11 ROOT
drwxr-x---. 14 root root 4096 May 15 00:11 docs
drwxr-x---. 6 root root 83 May 15 00:11 examples
drwxr-x---. 5 root root 87 May 15 00:11 host-manager
drwxr-x---. 5 root root 103 May 15 00:11 manager
root@7adb6b053b8d:/usr/local/tomcat/webapps# mkdir test
root@7adb6b053b8d:/usr/local/tomcat/webapps# cd test/
root@7adb6b053b8d:/usr/local/tomcat/webapps/test# echo "Hello" > index.html
root@7adb6b053b8d:/usr/local/tomcat/webapps/test# cat index.html
Hello

访问地址http://192.168.182.40:8080/test/ 部署成功


docker部署mysql

docker run -p 3306:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql

命令说明:
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口。
-v -v $PWD/conf:/etc/mysql/conf.d:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。
-v $PWD/logs:/logs:将主机当前目录下的 logs 目录挂载到容器的 /logs。
-v $PWD/data:/var/lib/mysql :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。
-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。

接下来就可以通过客户端工作连接mysql了


数据卷
不使用数据卷时,容器之间的文件不能共享
数据卷是一个可以供一个或多个容器使用的特殊目录。

创建数据卷
[root@localhost docker]# mkdir tomcat
[root@localhost docker]# cd tomcat/
[root@localhost tomcat]# mkdir share
[root@localhost tomcat]# cd share/
[root@localhost share]# mkdir webapps
[root@localhost share]# docker run --name tomcat1 -d -p 8080:8080 -v /usr/local/docker/tomcat/share/webapps/:/usr/local/tomcat/webapps/ tomcat
a1023a9833c33492c19dff4ad0a8aec850efa546c0a66a794db536e487177c97
[root@localhost share]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1023a9833c3 tomcat "catalina.sh run" 9 seconds ago Up 8 seconds 0.0.0.0:8080->8080/tcp tomcat1
d7e966533d3e mysql "docker-entrypoint.s…" 4 hours ago Up 4 hours 0.0.0.0:3306->3306/tcp mysql

[root@localhost share]# cd webapps/
[root@localhost webapps]# mkdir ROOT
[root@localhost webapps]# cd ROOT/
[root@localhost ROOT]# vi index.html

浏览index.html
再次创建容器,webapps目录和宿主机目录共享

[root@localhost ROOT]# cd ..
[root@localhost webapps]# docker run --name tomcat2 -d -p 8081:8080 -v $PWD:/usr/local/tomcat/webapps/ tomcat
ce09255a95b4352acae994d41330563da540ca513cb4414c7db0c6055f4b5596


备份数据卷
这其实是利用 tar 命令来执行的。
备份的原理:使用 tar -zcvf 对数据卷打包压缩
创建一个 MySQL 容器:
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/conf:/etc/mysql \
-v /usr/local/docker/mysql/logs:/var/log/mysql \
-v /usr/local/docker/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql
进入 /usr/local/docker/mysql 目录,使用 tar -zxvf backup.tar.gz . 打包当前目录,即可得到一个压缩包,这个压缩包就是我们需要的备份数据。

 

恢复数据卷
解压缩备份数据压缩包
tar -zxvf backup.tar.gz
重新启动一个新的容器并将数据卷指向需要还原的数据卷目录
docker run -p 3306:3306 --name mysql \
-v /usr/local/docker/mysql/backup/conf:/etc/mysql \
-v /usr/local/docker/mysql/backup/logs:/var/log/mysql \
-v /usr/local/docker/mysql/backup/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql


Docker Compose简介和安装
Docker Compose就是简化Docker操作的工具,一个基于 docker 的工具,可以通过一个 yml 文件定义多容器的 docker 应用,通过一条命令就可以根据 yml 文件的定义 去创建或者管理这多个容器

docker compose 安装
下载地址:https://github.com/docker/compose/releases 下载docker-compose-Linux-x86_64,重命名docker-compose ,放入到linux /usr/local/bin目录中去
给 docker-compose 添加执行的权限
chmod +x /usr/local/bin/docker-compose
查看 docker-compose 的版本
docker-compose version

docker compose使用
docker compose可以非常方便的管理容器的生命周期
cd /usr/local/docker/tomcat
[root@localhost tomcat]# vi docker-compose.yml
version: '3'
services:
tomcat:
restart: always
image: tomcat
container_name: tomcat
ports:
- 8080:8080
volumes:
- /usr/local/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/test
environment:
TZ: Asia/Shanghai
这里需要注意的是每个节点之前是两个空格,:后面是一个空格
参数说明:
version:指定脚本语法解释器版本
services:要启动的服务列表
tomcat:服务名称,可以随便起名,不重复即可
restart:启动方式,这里的 always 表示总是启动,即使服务器重启了也会立即启动服务
image:镜像的名称,默认从 Docker Hub 下载
container_name:容器名称,可以随便起名,不重复即可
ports:端口映射列列表,左边为宿主机端口,右边为容器端口

前台运行
[root@localhost tomcat]# docker-compose up
后台运行:
[root@localhost tomcat]# docker-compose up -d

启动
docker-compose start
停止
docker-compose stop
停止并移除容器
docker-compose down

docker-compose ls     # 列出所有容器

docker-compose images   # 列出所使用的镜像

docker-compose exec [service_name: eg wordpress] bash  # 进入正在服务的容器内部

eg: docker-compose exec wordpress bash

接下来写个docker-compose.yml 部署一个wordpress 

version: '3'

 

services:

# 定义了 两个 service 分别是 名字分别是 wordpress 和 mysql

  wordpress:

#image 为 word press

    image: wordpress

#本地 8888 端口 映射 容器 80 端口

    ports:

      - 8888:80

#wordpress 连接数据库 的 host 为 mysql , passwword 为 root 类似于 -e

    environment:

      WORDPRESS_DB_HOST: mysql

      WORDPRESS_DB_PASSWORD: root

#指定连接 的网络 为 my-bridge

    networks:

      - my-bridge

 

  mysql:

    image: mysql:5.7.27

# 数据库 root 的 连接密码 和 所使用的数据库名称

    environment:

      MYSQL_ROOT_PASSWORD: root

      MYSQL_DATABASE: wordpress

# 外部 mysql-data 挂载到 容器内的 /var/lib/mysql

    volumes:

      - mysql-data:/var/lib/mysql

#指定连接 的网络 为 my-bridge

    networks:

      - my-bridge

 

# 定义 volumes

volumes:

  mysql-data:

 

# 定义 networks

networks:

  my-bridge:

    driver: bridge
View Code

然后进入到docker-compose.yml目录下执行docker-compose up -d

接下来执行http://192.168.189.129:8888 就可以访问了

 

 

 

 

Docker Compose 运行 MySQL

docker-compose.yml 配置文件:
version: '3'
services:
mysql:
restart: always
image: mysql
container_name: mysql
ports:
- 3306:3306
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: 123456
command:
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--max_allowed_packet=128M
--sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
volumes:
- mysql-data:/var/lib/mysql

volumes:
mysql-data:

参考资料:https://topsale.gitbooks.io/java-cloud-dubbo/content/chapter3.html

 

 

 

列出所有的容器 ID
docker ps -aq
停止所有的容器
docker stop $(docker ps -aq)
删除所有的容器
docker rm $(docker ps -aq)
删除所有的镜像
docker rmi $(docker images -q)

posted @ 2018-05-30 17:10  学亮  阅读(753)  评论(0编辑  收藏  举报