文章目录
一、安装docker
1、安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
2、设置docker安装源
有国外的和阿里云两个可以选(二选一), 因为国外的比较慢,可以选国内的阿里云镜像源
国外镜像源:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
阿里云镜像源:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum makecache fast
3、安装社区版Docker-CE
yum install -y docker-ce
4、启动docker
设置开机启动:
systemctl enable docker
启动docker
systemctl start docker
测试是否成功
docker有一个测试用的hello world镜像
docker run hello-world
5、配置镜像加速器
国内下载较慢,可以配置镜像加速器,如果没开通过这个服务需要创建一个镜像,按照提示操作即可。
直接在虚拟机中运行阿里云控制台中提示的命令即可。
6、拉取镜像
从daocloud上拉取镜像https://hub.daocloud.io/
注册账号,登陆搜索镜像
选择版本后拉取:
二、docker镜像
输入docker 能看到提示的命令:
1、搜索镜像
搜索帮助
docker search --help
查看docker镜像
docker images
现在本机没有镜像,可以下载镜像。可以进行搜索
docker search 关键字 --limit 条数
比如找nginx镜像
3、安装镜像
拉取java镜像,如果不写版本号就默认下载最新版本
docker pull 镜像版本
版本可以去官网查看https://hub.docker.com/
安装镜像
如果一个镜像的名不能直接说明它的信息,可以通过命令修改tag:
docker tag IMAGEID 新镜名称:新标签
3、删除镜像
删除之前要保证镜像没有被任何容器使用,如果有容器需要先删除容器
docker rmi 镜像名:版本
docker rmi nginx:latest
4、备份镜像
再安装一个nginx镜像
docker pull nginx
备份本地镜像仓库
docker save -o nginx.img.tar nginx
5、导入镜像
docker load -i nginx.img.tar
三、docker容器
1、启动容器
docker run 参数 镜像名称:tag
运行一个容器时,若只是指定了镜像名,而没有指定其tag,docker默认会以tag为latest(最新版本)的镜像去启动容器,假如本地不存在这个镜像则先会报错;之后会尝试下载这个镜像,下载成功后再次运行容器和所要执行的命令。
后台启动容器
docker run -itd 镜像:版本
或者
docker run -itd 镜像id
-itd运行一个在后台执行的容器,同时,还能用控制台管理
2、停止容器
docker stop 容器id
docker ps -a
:可以列出所有容器,包括未运行的容器
docker rm 容器id
:删除容器
docker start 容器id
:启动一个容器
docker restart 容器id
:重新启动一个容器
3、端口映射
映射端口,docker的网络和宿主机网络不在一个网段,不能直接访问,需要进行端口映射
docker run -itd -p 宿主机端口:docker端口 镜像id
如:新建容器启动nginx
docker run -itd -p 80:80 2622e6cca7eb
停止nginx服务
docker stop 1da4608e1cc9
4、容器命名
docker容器在启动的时候有个名字随机的名字,名字是唯一的,用于区分容器.通过容器的name也可以操作容器,作用和容器id是一样的。可以自己指定容器的名字:
docker run -itd --name 新名字
如端口映射启动nginx并指定容器名称
docker run -itd --name nginx1 -p 80:80 2622e6cca7eb
通过容器名停止容器
docker stop nginx1
重命名容器
docker rename 原名字 新名字
5、其它命令
查看本地所有容器(包括未运行的):
docker ps -a
查看最近一次启动的容器(不论现在是启动还是停止):
docker ps -l
查看正在运行的容器id
docker ps -q
查看所有容器id
docker ps -aq
查看容器的元数据信息,有启动时执行的命令或程序、运行时的IP、所使
用的镜像等:
docker inspect <容器ID|容器名>
查看容器ip:
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器id
删除容器
docker rm 容器id
在宿主机直接运行容器中的命令
docker exec 容器名/容器 ID(不是镜像名/镜像ID) 执行的命令 [参数]
如:
docker exec amazing_elion cat /etc/redhat-release
查看日志
docker logs 容器id|容器名
可以通过使用docker logs命令来查看容器的运行日志
--tail
:选项可以指定查看最后几条日志
-t
:选项则可以对日志条目附加时间戳。
--until
:显示在某个时间戳(例如:2018-05-25T 13:23:37)之前的日 志,还可以相对时间(例如:42m 42 minutes )
在宿主机和容器之间传递文件:
docker cp [OPTIONS] CONTAINER:PATH LOCALPATH docker cp [OPTIONS] LOCALPATH|- CONTAINER:PATH
将容器中的centos7.4:/root/a.txt 复制到宿主机当前路径.(最后那个.
是宿主机当前路径)
docker cp centos7.4:/root/a.txt .
把宿主机当前路径下的a.txt传回容器:
docker cp ./a.txt centos7.4:/root/a.txt
在宿主机查看容器的变化:
docker diw 容器id
[root@localhost ~]# docker diff 78d A /change_dir A /change_dir/file.txt C /root A /root/.bash_history A /test
A 表示在原来的基础上,做了添加
C 表示在原来的基础上,做了改变
四、数据卷
如果删除容器,那么容器中的东西就都删除了。我们可以把文件存在宿主机,这样删掉容器之后,文件还在宿主机上。数据卷可以在多个容器之间共享。并且直接在容器中修改文件,如果文件错误,会造成容器无法启动,宿主机不能进入未启动的容器,也就不能再修正错误的文件了,这个容器就废掉了。如果文件挂载到外部,可以直接在宿主机修改。
以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:5.7.24
-v
宿主机目录:镜像目录 是把镜像中对应的文件挂载宿主机目录中
-e
容器启动时的参数
-d
镜像,如果本地没有,则会自动拉取镜像
docker stop mysql 停止容器,此时不能再连接到数据库了
docker rm mysql 删除容器
再用上面相同的方式开启一个容器,再次连接数据库,可以看到数据都在。
五、自定义镜像
容器是一个静态环境,镜像中它是什么样子,运行起来就是什么样,是不能改变的。如果想在容器中运行写好的项目,需要把项目打包发布出去。
这时需要自定义镜像。
自定义镜像,使用Dockerfile,注意没有后缀名
例如有一个打好的包,boot.jar,上传到宿主机的/usr/local/docker下放的是一个springboot的jar包,运行的时候会返回文字(代码不重要,写什么都可以)
package com.boot.test;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@RequestMapping("index")
public String index(){
return "hello Docker";
}
}
如果在服务器直接运行 是java -jar boot.jar
如果想在容器中运行,需要创建Dockerfile
vim Dockerfile
内容
FROM java
COPY boot.jar /
CMD java -jar /boot.jar
FROM 镜像名
COPY 宿主机文件 镜像位置
CMD 在镜像中需要执行的命令
使用java镜像
复制boot.jar到docker的根目录下
执行cmd运行jar包
注意复制的文件和Dockerfile在一个目录下面,不能写宿主机绝对路径,否则会报错
构建镜像 -t代表target,testdocker是自定义的镜像名,最后的.代表当前路径
docker build -t testdocker .
启动镜像
docker run -itd -p 8080:8080 d1d5bed4d8ea
访问对应的端口和请求路径就能看到结果
查看日志
docker logs 容器id
可以查看启动过程,和本机运行的控制台是一样的
六、发布镜像
先登录docker hub,如果没账号的话,可以先注册一个
创建自己的镜像
创建完之后会有个路径,一般是 用户名/仓库名
docker push 路径
需要注意的是本地的仓库需要带着路径,如果本地镜像叫aa,你的用户名叫user,那么路径就是user/aa
本地原来叫aa,需要重命名成user/aa,否则会报错
重命名:
docker tag 镜像id 用户名/镜像名:版本
把Dockerfile 推送到docker hub
七、docker compose
docker compose负责快速部署分布式
安装命令:
sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
最后一步如果下载不下来,就换一个地址:
git clone https://github.com/creationix/nvm.git ~/.nvm && cd ~/.nvm && git checkout git describe --abbrev=0 --tags
卸载
sudo rm /usr/local/bin/docker-compose
常用命令
前台运行:docker-compose up
后台运行:docker-compose up -d
启动:docker-compose start
停止:docker-compose stop
停止并移除容器:docker-compose down
默认的模板文件名称为:docker-compose.yml
,格式为 YAML 格式。、
version: "3"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
version 是语言版本
service 是服务
webapp是服务名,名字可以自定义
image 是使用的镜像
ports 是端口映射
volumes 是数据卷
安装tomcat
例如,使用docker-compose安装tomcat
创建docker-compose.yml文件
version: '3.1'
services:
tomcat:
restart: always
image: daocloud.io/library/tomcat:8.5-jre8-slim
container_name: tomcat
ports:
- 8080:8080
volumes:
- /usr/local/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/test
environment:
TZ: Asia/Shanghai
保存之后运行命令,如果本地没有镜像会下载
docker-compose up -d
访问宿主机的8080端口可以看到tomcat界面
安装mysql
安装mysql5.7.24
version: '3.1'
services:
mysql:
restart: always
image: mysql:5.7.24
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:
安装mysql8
version: '3.1'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
ports:
- 3306:3306
volumes:
- ./data:/var/lib/mysql
adminer:
image: adminer
restart: always
ports:
- 8080:8080
如果想同时安装mysql和tomcat,可以写到一个docker-compose.yml中
version: '4.1'
services:
tomcat:
restart: always
image: daocloud.io/library/tomcat:8.5-jre8-slim
container_name: tomcat
ports:
- 8080:8080
volumes:
- /usr/local/docker/tomcat/webapps/test:/usr/local/tomcat/webapps/test
environment:
TZ: Asia/Shanghai
mysql:
restart: always
image: mysql:5.7.24
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
八、使用docker安装gitlab
使用Docker来安装和运行Gitlab中文版,由于新版本问题较多,这里使用目前相对稳定的10.5版本,docker-compose .yml配如下:
version: '3'
services:
web:
image: 'twang2218/gitlab-ce-zh:10.5'
restart: always
hostname: '121.196.62.166'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://121.196.62.166:8080'
gitlab_rails['gitlab_shell_ssh_port'] = 2222
unicorn['port'] = 8888
nginx['listen_port'] = 8080
ports:
- '8080:8080'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
这里云服务器是2g内存带不动,gitlab耗内存,3g内存可以打开