Docker备忘录
centOS安装教程:https://docs.docker-cn.com/engine/installation/linux/docker-ce/centos/
一、常用命令
docker build -t friendlyname .# 使用此目录的 Dockerfile 创建镜像
docker run -p 4000:80 friendlyname # 运行端口 4000 到 90 的“友好名称”映射
docker run -d -p 4000:80 friendlyname # 内容相同,但在分离模式下
docker ps # 查看所有正在运行的容器的列表
docker stop <hash> # 平稳地停止指定的容器
docker ps -a # 查看所有容器的列表,甚至包含未运行的容器
docker kill <hash> # 强制关闭指定的容器
docker rm <hash> # 从此机器中删除指定的容器
docker rm $(docker ps -a -q) # 从此机器中删除所有容器
docker images -a # 显示此机器上的所有镜像
docker rmi <imagename> # 从此机器中删除指定的镜像
docker rmi $(docker images -q) # 从此机器中删除所有镜像
docker login # 使用您的 Docker 凭证登录此 CLI 会话
docker tag <image> username/repository:tag # 标记 <image> 以上传到镜像库
docker push username/repository:tag # 将已标记的镜像上传到镜像库
docker run username/repository:tag # 运行镜像库中的镜像
$ sudo systemctl start docker //启动docker
$ docker run -d -p 27017:27017 --name some-mongo mongo //启动容器
$shell> docker exec -it mysql1 bash //进入mysql1容器
$bash-4.2# mysql -uroot -p //在mysql1容器执行。进入mysql
$docker restart mysql01 //重启容器
service docker start //启动容器
docker build --rm //build时删除中间镜像
1,设置docker镜像地址
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
二、mysql容器
1,使用mysql的一些问题
创建的mysql的root用户只能通过本地登录。这种问题可以直接把root的host改为0.0.0.0允许任何ip登录。root是超级用户,这样做不安全,一般建议另创建一个用户:
mysql> CREATE USER 'test'@'localhost' IDENTIFIED BY 'pwd123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost' WITH GRANT OPTION;
mysql> CREATE USER 'test'@'%' IDENTIFIED BY 'pwd123456';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION;
ALTER USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123456';
ALTER USER 'test'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd123456';
SELECT plugin FROM mysql.user WHERE User = 'test';
client does not support authentication protocol by server;consider upgrading MYSQL client解决方法
2,允许mysql容器时设置用户名和密码和字符集
docker run -d -p : -e MYSQL_USER="hunter" -e MYSQL_PASSWORD="pwd123456" -e MYSQL_ROOT_PASSWORD="pwd213456" --name mysql2 mysql/mysql-server --character-set-server=utf8 --collation-server=utf8_general_ci
show variables like "%char%"; //查看字符集
三、资料卷挂载
1,使用Volume进行mysql资料卷挂载
①在主机上新建 /docker/mysql/config/my.cnf 文件和 /docker/mysql/data 目录
在my.conf文件中指定用户(必须指定,不然会报错)
[mysqld]
user=mysql
[mysqld]
character-set-server=utf8
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
设置编码格式
②启动mysql
[root@localhost config]# docker run -d -p : --name mysql3 -v=/docker/mysql/config/my.cnf:/etc/my.cnf -v=/docker/mysql/data:/var/lib/mysql mysql/mysql-server
将容器中的 /etc/my.cnf 映射到主机的 /docker/mysql/config/my.cnf:/etc/my.cnf 文件。
将容器的 /var/lib/mysql 目录映射到主机的 /docker/mysql/data 目录
四、镜像打包
FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app # Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore # Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out # Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "demo.dll"]
案例下载:https://pan.baidu.com/s/1DLod4xexm7-_UjJ6A8N-Ug
五、容器互联
docker inspect mysql1 //查看容器网络
docker inspect network test1_default //查看网络
docker network create -d bridge my-net // 新建my-net网络
docker network ls //查看网路
docker network connect my-net mysql1 //将运行的容器加入到my-net网络
docker run -d -p 7001:80 --net my-net --name aspcore1 aspcore:1.1 //启动容器时加入网络
yum install -y iputils //yum安装ping
六、Docker-Compose
1,基本命令
①安装
$ 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
docker-compose up //该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作
docker-compose up -d //后台启动
docker-compose down //此命令将会停止 up
命令所启动的容器,并移除网络
2,启动asp.net core+mysql
version: "3"
services: db:
image: mysql/mysql-server
container_name: db
#执行mysql命令指定编码格式
command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
ports:
- "3306:3306"
#指定容器退出后的重启策略为始终重启。该命令对保持服务始终运行十分有效,在生产环境中推荐配置为 always 或者 unless-stopped。
restart: always
environment:
MYSQL_USER: hunter
MYSQL_PASSWORD: pwd123456
MYSQL_ROOT_PASSWORD: pwd123456
volumes:
# 主机/docker/mysql/init目录映射到mysql容器/docker-entrypoint-initdb.d目录
# 启动时会允许此目录下的sql脚本
- /docker/mysql2/init:/docker-entrypoint-initdb.d
- /docker/mysql2/config/my.cnf:/etc/my.cnf
- /docker/mysql2/data:/var/lib/mysql web1:
depends_on:
- db
build: .
container_name: aspcore1
ports:
- "8002:80"
打包asp.net core镜像
FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app # Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore # Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out # Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "demo.dll"]
Dockerfile
mysql初始化执行的脚本,设置权限
GRANT ALL PRIVILEGES ON *.* TO 'hunter'@'%' WITH GRANT OPTION;
ALTER USER 'hunter'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123456';
init.sql
使用重试方式,保证在db初始完成之后执行种子命令
using System;
using Microsoft.Extensions.DependencyInjection;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using System.Threading; namespace demo.Data
{
public class MyDbContextSeed
{ private ILogger<MyDbContextSeed> _logger;
public MyDbContextSeed(ILogger<MyDbContextSeed> logger)
{
_logger=logger;
} public void Seed(IServiceProvider service,int retry)
{
_logger.LogDebug("InSeed");
try{
using(var services=service.CreateScope())
{
var provider= services.ServiceProvider;
var logFactory= services.ServiceProvider.GetService<ILoggerFactory>();
var context= provider.GetRequiredService<MyDbContext>();
_logger.LogDebug("Migrate_Start");
context.Database.Migrate();
_logger.LogDebug("Migrate_End");
if(!context.Users.Any())
{
_logger.LogDebug("UserAdd_Start");
context.Users.Add(new User(){Password="123456",UserName="hunter"});
context.SaveChanges();
_logger.LogDebug("UserAdd_End");
}
}
}
catch(Exception ex){
_logger.LogError("失败重试:"+retry);
Thread.Sleep();
Seed(service,++retry);
} }
}
}
MyDbContextSeed.cs
连接字符串server使用的容器名称
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"MysqlConnection": "server=db;port=3306;database=demo1;userid=hunter;password=pwd123456;"
}
}
appsettings.json
案例下载:https://pan.baidu.com/s/1lAy6pM9uipQnbvGG6A2TYQ
七、Gitlab
参考教程:https://docs.gitlab.com/omnibus/docker/#after-starting-a-container
本例使用 GitLab CE 镜像,如果使用 GitLab EE 将镜像名称替换为 gitlab/gitlab-ee:latest
gitlab可以使用以下三种方式运行
- 使用docker引擎运行
- 将gitlab安装到集群中
- 使用docker-compose安装
运行镜像
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
这将下载并启动GitLab CE容器并发布访问SSH,HTTP和HTTPS所需的端口。
所有GitLab数据都将存储为/srv/gitlab/的子目录。
restart always:系统重启后,容器将自动重启。
您现在可以按照启动容器后的说明登录Web界面。
数据存储在哪里?
GitLab容器使用主机安装的卷来存储持久数据:
Local location | Container location | Usage |
---|---|---|
/srv/gitlab/data |
/var/opt/gitlab |
用于存储应用数据 |
/srv/gitlab/logs |
/var/log/gitlab |
用于存储日志 |
/srv/gitlab/config |
/etc/gitlab |
用于存储GitLab配置文件 |
配置GitLab
此容器使用官方的Omnibus GitLab软件包,因此所有配置都在唯一的配置文件 /etc/gitlab/gitlab.rb 中完成。
打开/etc/gitlab/gitlab.rb后,确保将 external_url 设置为指向有效的URL。
要从GitLab接收电子邮件,您必须配置SMTP设置,因为GitLab Docker映像没有安装SMTP服务器。
完成所需的所有更改后,需要重新启动容器才能重新配置GitLab: sudo docker restart gitlab
预配置Docker容器
您可以通过将环境变量GITLAB_OMNIBUS_CONFIG添加到docker run命令来预配置GitLab Docker映像。注意:GITLAB_OMNIBUS_CONFIG中包含的设置不会写入gitlab.rb配置文件
这是一个设置外部URL并在启动容器时启用LFS的示例:
sudo docker run --detach \
--hostname gitlab.example.com \
--env GITLAB_OMNIBUS_CONFIG="external_url 'http://my.domain.com/'; gitlab_rails['lfs_enabled'] = true;" \
--publish : --publish : --publish : \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
请注意,每次执行docker run命令时,都需要提供GITLAB_OMNIBUS_CONFIG选项。 后续运行之间不保留GITLAB_OMNIBUS_CONFIG的内容。
由于22端口被占用我使用的是23。网站端口改为8099
启动容器后
初始化过程可能需要很长时间。 您可以使用命令 sudo docker logs -f gitlab 跟踪此过程
您第一次访问GitLab时,系统会要求您设置管理员密码。 更改后,您可以使用用户名root和您设置的密码登录
将GitLab升级到更新版本
要将GitLab升级到新版本,您必须:
1、停止正在运行的容器: sudo docker stop gitlab
2、删除现有容器: sudo docker rm gitlab
3、拉新镜像: sudo docker pull gitlab/gitlab-ce:latest
4、使用先前指定的选项再次创建容器:
sudo docker run --detach \
--hostname gitlab.example.com \
--publish : --publish : --publish : \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
在第一次运行时,GitLab将重新配置和更新自己。
在公共IP地址上运行GitLab CE
您可以通过修改--publish标志使Docker使用您的IP地址并将所有流量转发到GitLab CE容器。
在IP 1.1.1.1上公开GitLab CE:
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 1.1.1.1:: \
--publish 1.1.1.1:: \
--publish 1.1.1.1:: \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
然后,您可以访问http://1.1.1.1/和https://1.1.1.1/访问您的GitLab实例
在不同的端口上公开GitLab
GitLab默认会占用容器内的以下端口:
80
(HTTP)443
(if you configure HTTPS)8080
(Unicorn使用的)22
(SSH守护程序使用的)
如果要为容器使用与80(HTTP)或443(HTTPS)不同的端口,则需要在docker run命令中添加单独的--publish指令。
例如,要在端口8929上公开Web界面,在端口2289上公开SSH服务,请使用以下docker run命令:
sudo docker run --detach \
--hostname gitlab.example.com \
--publish : --publish : \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
然后,您需要适当地配置gitlab.rb:
1,配置 external_url :
# For HTTP
external_url "http://gitlab.example.com:8929" or # For HTTPS (notice the https)
external_url "https://gitlab.example.com:8929"
2,配置 gitlab_shell_ssh_port :
gitlab_rails['gitlab_shell_ssh_port'] =
按照上面的示例,您将能够通过<hostIP>:8929下的Web浏览器访问GitLab,并使用端口2289下的SSH进行推送。
可以在docker-compose部分中找到使用不同端口的docker-compose.yml示例
诊断潜在问题
读取容器日志: sudo docker logs gitlab
输入运行容器: sudo docker exec -it gitlab /bin/bash
在容器内,您可以像管理Omnibus安装一样管理GitLab容器
使用docker-compose安装GitLab
使用Docker撰写,您可以轻松配置,安装和升级基于Docker的GitLab安装。
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.com'
# Add any other gitlab.rb configuration here, each on its own line
ports:
- '80:80'
- '443:443'
- '22:22'
volumes:
- '/srv/gitlab/config:/etc/gitlab'
- '/srv/gitlab/logs:/var/log/gitlab'
- '/srv/gitlab/data:/var/opt/gitlab'
确保您与docker-compose.yml在同一目录中并运行docker-compose up -d以启动GitLab
下面是另一个docker-compose.yml示例,其中GitLab在自定义HTTP和SSH端口上运行。 注意GITLAB_OMNIBUS_CONFIG变量如何与ports部分匹配:
web:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: 'gitlab.example.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.example.com:9090'
gitlab_rails['gitlab_shell_ssh_port'] =
ports:
- '9090:9090'
- '2224:22'
volumes:
- '/srv/gitlab/config:/etc/gitlab'
- '/srv/gitlab/logs:/var/log/gitlab'
- '/srv/gitlab/data:/var/opt/gitlab'
这与使用--publish 9090:9090 --publish 2224:22相同
使用Docker compose更新GitLab
如果你使用docker-compose安装了GitLab,你所要做的就是运行docker-compose pull和docker-compose up -d来下载新版本并升级你的GitLab实例
将GitLab安装到群集中
GitLab Docker镜像也可以部署到各种容器调度平台。
- Kubernetes using the GitLab Helm Charts.
- Mesosphere DC/OS using the DC/OS Package.
- Docker Cloud using the docker-compose config.
故障排除
1,500内部错误
更新Docker镜像时,您可能会遇到一个问题,其中所有路径都显示臭名昭着的500页。 如果发生这种情况,请尝试运行sudo docker restart gitlab重启容器并纠正问题
2,许可问题
从旧的GitLab Docker映像更新时,您可能会遇到权限问题。 这是因为先前镜像中的用户未正确保留。 有修复所有文件权限的脚本。
要修复容器,只需执行update-permissions并在之后重新启动容器:
sudo docker exec gitlab update-permissions
sudo docker restart gitlab
3,Windows/Mac: Error executing action run on resource ruby_block[directory resource: /data/GitLab]
在Windows或Mac上使用Docker Toolbox和VirtualBox并使用Docker卷时会发生此错误。/c/Users卷作为VirtualBox共享文件夹安装,不支持所有POSIX文件系统功能。 如果没有重新挂载,则无法更改目录所有权和权限,并且GitLab失败。
我们的建议是切换到您的平台使用本机Docker安装,而不是使用Docker Toolbox。
如果您无法使用本机Docker安装(Windows 10 Home Edition或Windows <10),那么另一种解决方案是为Docker Toolbox的boot2docker设置NFS挂载而不是VirtualBox共享
4,Linux ACL问题
如果您在docker主机上使用文件ACL,则docker1组需要对卷进行完全访问才能使GitLab正常工作。
$ getfacl /srv/gitlab
# file: /srv/gitlab
# owner: XXXX
# group: XXXX
user::rwx
group::rwx
group:docker:rwx
mask::rwx
default:user::rwx
default:group::rwx
default:group:docker:rwx
default:mask::rwx
default:other::r-x
如果这些不正确,请将它们设置为:
$ sudo setfacl -mR default:group:docker:rwx /srv/gitlab
Docker备忘录的更多相关文章
- Docker 实践备忘录
平时零散的接触docker,时间久了概念和命令都会忘了,所以集中记下: docker 目标是实现轻量级的操作系统虚拟化解决方案. Docker 的基础是 Linux 容器(LXC)等技术 docker ...
- 常用docker命令备忘录
查看镜像 docker images 查看运行中的容器 docker ps 删除镜像 docker rmi 容器id 直接删除所有镜像 docker rmi `docker images -q` 直接 ...
- docker 常用命令备忘录
基础命令 docker version docker info docker --help 镜像命令 查看 docker images 其中: REPOSITORY:表示镜像的仓库源 TAG: ...
- Docker 基础备忘录
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机).bare metal. ...
- 【云计算】docker前世今生
下一代云计算模式:Docker正掀起个性化商业革命 作者: 吴宁川 来源: ITValue 发布时间: 2015-09-20 10:41 阅读: 12976 次 推荐: 24 ...
- Fbric、Ansible、Docker、Chaos Monkey:DevOps工具的年中回顾
Fbric.Ansible.Docker.Chaos Monkey:DevOps工具的年中回顾 [编者按]近日,Cyber Engineering Solutions Group 技术经理 Hasan ...
- 下一代云计算模式:Docker正掀起个性化商业革命
作者: 吴宁川 来源: ITValue 发布时间: 2015-09-20 10:41 阅读: 10008 次 推荐: 16 原文链接 [收藏] 文/ITValue 记者吴宁川 从 20 ...
- 转 下一代云计算模式:Docker正掀起个性化商业革命
下一代云计算模式:Docker正掀起个性化商业革命 作者: 吴宁川 来源: ITValue 发布时间: 2015-09-20 10:41 阅读: 14052 次 推荐: 26 原文链接 ...
- Spring Boot Docker
1. IDEA中配置Docker Docker默认只接受本地客户端的请求,为了能够远程访问它,首先要开放Docker的监听端口,运行外部应用可以访问 修改 /lib/systemd/system/d ...
随机推荐
- ARMV8 datasheet学习笔记1:预备知识
1. 前言 ARMv8的架构继承以往ARMv7与之前处理器技术的基础; 除了支持现有的16/32bit的Thumb2指令外,也向前兼容现有的A32(ARM 32bit)指令集. 基于64bit的AAr ...
- ubuntu 用 apt get 安装某个包的某个版本
1.首先用如下命令查询你的机器安装了哪些版本: dpkg -l 'apache2*' 2.然后用如下命令查询远程库存在哪些版本: apt-cache madison "libqt5gui5& ...
- Mysql Binlog三种格式介绍及分析【转】
一.Mysql Binlog格式介绍 Mysql binlog日志有三种格式,分别为Statement,MiXED,以及ROW! 1.Statement:每一条会修改数据的sql都会记录在 ...
- windows命令行中英文切换
Windows下cmd命令提示符窗口的语言设置(中英) 打开cmd命令提示窗口 输入 chcp 936 使用ping 命令 显示中文 2 同样 输入chcp 437 3 使用ping 命令
- LVS负载均衡器DR模型的实现
概述: 在大规模互联网应用中,负载均衡设备是必不可少的一个节点,源于互联网应用的高并发和大流量的冲击压力,我们通常会在服务端部署多个无状态的应用服务器和若干有状态的存储服务器(数据库.缓存等等) 一. ...
- 同时装了Python3和Python2,怎么用pip
作者:匿名用户链接:https://www.zhihu.com/question/21653286/answer/95532074来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- as 插件GsonFormat用法(json字符串快速生成javabean)
GsonFormat 主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 插件地址:https://plugins.jetbra ...
- vue-router两种模式,到底什么情况下用hash,什么情况下用history模式呢?
转:https://segmentfault.com/q/1010000010340823/a-1020000010598395 为什么要有 hash 和 history 对于 Vue 这类渐进式前端 ...
- intellij idea svn 修改文件后,父文件夹也标注修改
svn文件修改后,默认只有当前文件更改而父文件没有标注,很不直观:查了一顿后,发现,可以设置: File—->settings—->version control—–>勾选show ...
- RabbitMQ(一):RabbitMQ 安装与配置(Mac)
一.rabbitmq 安装与配置 安装: brew install rabbitmq # 进入安装目录 cd /usr/local/Cellar/rabbitmq/3.7.12 # 启动 brew s ...